From d4109b2cef809daba0f95f244029456613383f01 Mon Sep 17 00:00:00 2001
From: houxiao <houxiao@454eff88-639b-444f-9e54-f578c98de674>
Date: 星期五, 06 一月 2017 11:31:42 +0800
Subject: [PATCH] add pm list test
---
RtspFace/PL_Fork.h | 61 ++++++
RtspFace/make.sh | 6
RtspFace/PL_SensetimeFaceTrack.h | 34 +++
RtspFace/PipeLine.h | 13
RtspFace/PL_SensetimeFaceTrack.cpp | 57 +++++
RtspFace/PL_DlibFaceTrack.cpp | 1
RtspFace/PL_H264Decoder.cpp | 2
RtspFace/PL_Fork.cpp | 151 +++++++++++---
RtspFace/main.cpp | 58 +++--
RtspFace/main_dump_st_face.cpp | 110 +++++++++++
RtspFace/PL_RTSPClient.cpp | 4
RtspFace/PipeLine.cpp | 67 +++++-
12 files changed, 479 insertions(+), 85 deletions(-)
diff --git a/RtspFace/PL_DlibFaceTrack.cpp b/RtspFace/PL_DlibFaceTrack.cpp
index 5c5dcea..0f88a75 100644
--- a/RtspFace/PL_DlibFaceTrack.cpp
+++ b/RtspFace/PL_DlibFaceTrack.cpp
@@ -281,7 +281,6 @@
in->payError = false;
//in->buffer readly
-in->payError = false;//#todo
in->lastFrame.type = MB_Frame::MBFT_YUV420;
in->lastFrame.buffer = frame->buffer;//#todo should copy
in->lastFrame.buffSize = frame->buffSize;
diff --git a/RtspFace/PL_Fork.cpp b/RtspFace/PL_Fork.cpp
index 9bf79c3..627a857 100644
--- a/RtspFace/PL_Fork.cpp
+++ b/RtspFace/PL_Fork.cpp
@@ -1,49 +1,122 @@
-#ifndef _PL_FORK_H_
-#define _PL_FORK_H_
+#include "PL_Fork.h"
+#include "MaterialBuffer.h"
+#include "logger.h"
-#include "PipeLine.h"
-
-struct PL_Fork_Config
+struct PL_Fork_Internal
{
+ //uint8_t buffer[1920*1080*4];
+ //size_t buffSize;
+ //size_t buffSizeMax;
+ PipeMaterial lastPm;
+
+ MB_Frame lastFrame;
+
+ PL_Fork_Config config;
+
+ bool payError;
+
+ PL_Fork_Internal() :
+ //buffSize(0), buffSizeMax(sizeof(buffer)),
+ lastPm(), lastFrame(), config(), payError(true)
+ {
+ }
+
+ ~PL_Fork_Internal()
+ {
+ }
+
+ void reset()
+ {
+ //buffSize = 0;
+ payError = true;
+
+ PipeMaterial _lastPm;
+ lastPm = _lastPm;
+
+ MB_Frame _lastFrame;
+ lastFrame = _lastFrame;
+
+ PL_Fork_Config _config;
+ config = _config;
+ }
};
-class PL_Fork : public PipeLineElem
+PipeLineElem* create_PL_Fork()
{
-public:
- enum ForkBy
+ return new PL_Fork;
+}
+
+PL_Fork::PL_Fork() : internal(new PL_Fork_Internal), pl(nullptr)
+{
+}
+
+PL_Fork::~PL_Fork()
+{
+ delete (PL_Fork_Internal*)internal;
+ internal= nullptr;
+}
+
+bool PL_Fork::init(void* args)
+{
+ PL_Fork_Internal* in = (PL_Fork_Internal*)internal;
+ in->reset();
+
+ if (args == nullptr)
{
- FB_NONE,
- FB_TURNS,
- FB_RANDOM,
- FB_PM_TYPE,
- FB_MB_TYPE,
- FB_BREAK_LIST
- };
+ LOG_ERROR << "Config should give";
+ return false;
+ }
+
+ PL_Fork_Config* config = (PL_Fork_Config*)args;
+ in->config = *config;
+
+ return true;
+}
+
+void PL_Fork::finit()
+{
+ PL_Fork_Internal* in = (PL_Fork_Internal*)internal;
+
+}
+
+bool PL_Fork::pay(const PipeMaterial& pm)
+{
+ PL_Fork_Internal* in = (PL_Fork_Internal*)internal;
+ PL_Fork_Config& config(in->config);
+
+ in->lastPm = pm;
- enum ForkSync
+ return false;
+}
+
+bool PL_Fork::gain(PipeMaterial& pm)
+{
+ PL_Fork_Internal* in = (PL_Fork_Internal*)internal;
+
+ return false;
+}
+
+void PL_Fork::attach_pipe_line(PipeLine* pl)
+{
+ PL_Fork_Internal* in = (PL_Fork_Internal*)internal;
+
+ if (this->pl != nullptr)
{
- FS_NONE,
- FS_SEQUENCE,
- FS_PARALLEL,
- FS_MAIN_PL_FIRST,
- FS_MAIN_PL_LAST,
- };
-
-public:
- PL_Fork();
- virtual ~PL_Fork();
-
- virtual bool init(void* args);
- virtual void finit();
-
- virtual bool pay(const PipeMaterial& pm);
- virtual bool gain(PipeMaterial& pm);
+ LOG_ERROR << "Has areadly attached pipe line";
+ return;
+ }
-private:
- void* internal;
-};
-
-PipeLineElem* create_PL_Paint();
-
-#endif
+ if (pl == nullptr)
+ {
+ LOG_NOTICE << "Detach pipe line";
+ this->pl->remove_elem(this);
+ this->pl = nullptr;
+ return;
+ }
+
+ this->pl = pl;
+ PipeLine* mainPipeLineManager = this->manager;
+ pl->push_front_elem(this);
+ this->manager = mainPipeLineManager;
+}
diff --git a/RtspFace/PL_Fork.h b/RtspFace/PL_Fork.h
index 865044e..5eaaffe 100644
--- a/RtspFace/PL_Fork.h
+++ b/RtspFace/PL_Fork.h
@@ -3,8 +3,51 @@
#include "PipeLine.h"
+// p1e1 p1e2<fork> p1e3 ... p1eN
+// p2e1 p2e2... p2eN
class PL_Fork : public PipeLineElem
{
+public:
+ enum ForkBy
+ {
+ // do nothing
+ FB_NONE,
+
+ // time 1: p1e1 p1e2 [p1e3 ... p1eN]
+ // time 2: p1e1 p1e2 [p2e1 p2e2... p2eN]
+ FB_TURNS,
+
+ // p1e1 p1e2 [p1e3 ... p1eN]|[p2e1 p2e2... p2eN]
+ FB_RANDOM,
+
+ // supported now!
+ // p1e1 p1e2 TYPE1[p1e3 ... p1eN] TYPE2[p2e1 p2e2... p2eN]
+ // Sync behavior depends on ForkSync
+ FB_PM_TYPE,
+
+ // supported now!
+ FB_MB_TYPE,
+
+ // FS_MAIN_PL_FIRST: p1e1 p1e2 [p1e3 p2e1] [p1e4 p2e2] ...
+ // FS_MAIN_PL_LAST : p1e1 p1e2 [p2e1 p1e3] [p2e2 p1e4] ...
+ FB_ALTERNATE
+ };
+
+ enum ForkSync
+ {
+ // do nothing
+ FS_NONE,
+
+ // supported now!
+ FS_PARALLEL,
+
+ // Result of main pl will be paid to branch pl
+ FS_MAIN_PL_FIRST,
+
+ // Result of branch pl will be paid to main pl
+ FS_BRANCH_PL_FIRST
+ };
+
public:
PL_Fork();
virtual ~PL_Fork();
@@ -15,10 +58,26 @@
virtual bool pay(const PipeMaterial& pm);
virtual bool gain(PipeMaterial& pm);
+ void attach_pipe_line(PipeLine* pl);
+
private:
void* internal;
+ PipeLine* pl;
};
-PipeLineElem* create_PL_Paint();
+struct PL_Fork_Config
+{
+ PL_Fork::ForkBy forkBy;
+ PL_Fork::ForkSync forkSync;
+
+ int mainPLType;
+ int branchPLType;
+
+ PL_Fork_Config() :
+ forkBy(PL_Fork::FB_NONE), forkSync(PL_Fork::FS_NONE), mainPLType(0), branchPLType(0)
+ { }
+};
+
+PipeLineElem* create_PL_Fork();
#endif
diff --git a/RtspFace/PL_H264Decoder.cpp b/RtspFace/PL_H264Decoder.cpp
index 55a130c..7426bac 100644
--- a/RtspFace/PL_H264Decoder.cpp
+++ b/RtspFace/PL_H264Decoder.cpp
@@ -216,7 +216,7 @@
if (manager == NULL)
return false;
- std::string fmtp(manager->get_global_param(PLGP_RTSP_FMTP));
+ std::string fmtp(manager->get_param(PLGP_RTSP_FMTP));
if (fmtp.empty())
return false;
diff --git a/RtspFace/PL_RTSPClient.cpp b/RtspFace/PL_RTSPClient.cpp
index 0a1b163..d169da2 100644
--- a/RtspFace/PL_RTSPClient.cpp
+++ b/RtspFace/PL_RTSPClient.cpp
@@ -197,7 +197,7 @@
if (client->manager == nullptr)
return;
- client->manager->set_global_param(PLGP_RTSP_SDP, val);
+ client->manager->set_param(PLGP_RTSP_SDP, val);
}
void rtsp_client_fmtp_callback(void* arg, const char* val)
@@ -210,7 +210,7 @@
if (client->manager == nullptr)
return;
- client->manager->set_global_param(PLGP_RTSP_FMTP, val);
+ client->manager->set_param(PLGP_RTSP_FMTP, val);
}
void rtsp_client_frame_callback(void* arg, uint8_t* buffer, size_t buffSize, timeval presentationTime)
diff --git a/RtspFace/PL_SensetimeFaceTrack.cpp b/RtspFace/PL_SensetimeFaceTrack.cpp
index 541c79c..7802631 100644
--- a/RtspFace/PL_SensetimeFaceTrack.cpp
+++ b/RtspFace/PL_SensetimeFaceTrack.cpp
@@ -11,7 +11,9 @@
//size_t buffSize;
//size_t buffSizeMax;
MB_Frame lastFrame;
+ PipeMaterial pmList[2];
SensetimeFaceTrackConfig config;
+ st_ff_vect_t faceFeatures;
bool payError;
@@ -19,7 +21,7 @@
PL_SensetimeFaceTrack_Internal() :
//buffSize(0), buffSizeMax(sizeof(buffer)),
- lastFrame(), config(), payError(true),
+ lastFrame(), pmList(), config(), faceFeatures(), payError(true),
handle_track(nullptr)
{
}
@@ -35,6 +37,11 @@
MB_Frame _lastFrame;
lastFrame = _lastFrame;
+
+ PipeMaterial _pm;
+ pmList[0] = _pm;
+ pmList[1] = _pm;
+
SensetimeFaceTrackConfig _config;
config = _config;
@@ -130,6 +137,17 @@
cv::Mat yMat(cv::Size(width,height), CV_8UC1, buffer);
for (int i = 0; i < face_count; i++)
{
+ SensetimeFaceFeature faceFeature;
+ faceFeature.rect.leftTop.x = p_face[i].rect.left;
+ faceFeature.rect.leftTop.y = p_face[i].rect.top;
+ faceFeature.rect.rightBottom.x = p_face[i].rect.right;
+ faceFeature.rect.rightBottom.y = p_face[i].rect.bottom;
+ faceFeature.id = p_face[i].ID;
+ faceFeature.yaw = p_face[i].yaw;
+ faceFeature.pitch = p_face[i].pitch;
+ faceFeature.roll = p_face[i].roll;
+ faceFeature.eyeDistance = p_face[i].eye_dist;
+
LOGP(DEBUG, "face: %d-----[%d, %d, %d, %d]-----id: %d", i,
p_face[i].rect.left, p_face[i].rect.top,
p_face[i].rect.right, p_face[i].rect.bottom, p_face[i].ID);
@@ -156,7 +174,10 @@
for (int j = 0; j < p_face[i].points_count; j++)
{
-
+ FacePoint featurePoint;
+ featurePoint.x = p_face[i].points_array[j].x;
+ featurePoint.y = p_face[i].points_array[j].y;
+ faceFeature.featurePoints.push_back(featurePoint);
if (in->config.draw_face_feature_point)
{
@@ -164,6 +185,9 @@
p_face[i].points_array[j].y), 1, cv::Scalar(255, 255, 255));
}
}
+
+ if (in->config.generate_face_feature)
+ in->faceFeatures.push_back(faceFeature);
}
//if (face_count > 0)
@@ -203,6 +227,7 @@
return false;
}
+ in->faceFeatures.clear();
int face_count = doFaceTrack(
in, (uint8_t*)frame->buffer, frame->width, frame->height, frame->width, CV_PIX_FMT_YUV420P);
if (face_count < 0)
@@ -229,13 +254,35 @@
{
PL_SensetimeFaceTrack_Internal* in = (PL_SensetimeFaceTrack_Internal*)internal;
- if (!in->payError)
+ if (in->payError)
+ {
+ pm.former = this;
+ return false;
+ }
+
+ if (!in->config.generate_face_feature)
{
pm.type = PipeMaterial::PMT_FRAME;
pm.buffer = &(in->lastFrame);
pm.buffSize = 0;
- pm.former = this;
}
+ else
+ {
+ in->pmList[0].type = PipeMaterial::PMT_FRAME;
+ in->pmList[0].buffer = &(in->lastFrame);
+ in->pmList[0].buffSize = 0;
+ in->pmList[0].former = this;
+
+ in->pmList[1].type = PipeMaterial::PMT_BYTES;
+ in->pmList[1].buffer = &(in->faceFeatures);
+ in->pmList[1].buffSize = 0;
+ in->pmList[1].former = this;
+
+ pm.type = PipeMaterial::PMT_PM_LIST;
+ pm.buffer = in->pmList;
+ pm.buffSize = sizeof(in->pmList) / sizeof(PipeMaterial);
+ }
+
pm.former = this;
- return !in->payError;
+ return true;
}
diff --git a/RtspFace/PL_SensetimeFaceTrack.h b/RtspFace/PL_SensetimeFaceTrack.h
index 48030e8..c3bf593 100644
--- a/RtspFace/PL_SensetimeFaceTrack.h
+++ b/RtspFace/PL_SensetimeFaceTrack.h
@@ -2,6 +2,40 @@
#define _PL_SENSETIMEFACETRACK_H_
#include "PipeLine.h"
+#include <vector>
+
+struct FacePoint
+{
+ int x;
+ int y;
+
+ FacePoint() : x(0), y(0) { }
+};
+
+struct FaceRect
+{
+ FacePoint leftTop;
+ FacePoint rightBottom;
+
+ FaceRect() : leftTop(), rightBottom() { }
+};
+
+struct SensetimeFaceFeature
+{
+ FaceRect rect;
+ int id;
+ float yaw;
+ float pitch;
+ float roll;
+ float eyeDistance;
+ std::vector<FacePoint> featurePoints;
+
+ SensetimeFaceFeature() :
+ rect(), id(0), yaw(0.0), pitch(0.0), roll(0.0), eyeDistance(0.0), featurePoints()
+ {}
+};
+
+typedef std::vector<SensetimeFaceFeature> st_ff_vect_t;
struct SensetimeFaceTrackConfig
{
diff --git a/RtspFace/PipeLine.cpp b/RtspFace/PipeLine.cpp
index 1f3aba9..0aabd47 100644
--- a/RtspFace/PipeLine.cpp
+++ b/RtspFace/PipeLine.cpp
@@ -16,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()
{
}
@@ -27,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;
@@ -50,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)
@@ -59,11 +76,41 @@
}
}
+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;
+}
+
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)
@@ -170,22 +217,22 @@
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;
diff --git a/RtspFace/PipeLine.h b/RtspFace/PipeLine.h
index 79e1984..b208240 100644
--- a/RtspFace/PipeLine.h
+++ b/RtspFace/PipeLine.h
@@ -76,8 +76,12 @@
~PipeLine();
bool register_elem_creator(const std::string& type, elem_create_func_t func);
+ static bool register_global_elem_creator(const std::string& type, elem_create_func_t func);
+
void push_elem(PipeLineElem* elem);
PipeLineElem* push_elem(const std::string& type);
+ void push_front_elem(PipeLineElem* elem);
+ bool remove_elem(PipeLineElem* elem);
// do pipe sync. returns the element who returns false, or the last one.
// if false return, the element should deal with pm, clean up.
@@ -88,18 +92,19 @@
void pipe_notify(PipeLineElem*);
void pipe_stop();
- void set_global_param(const std::string& name, const std::string& value);
- std::string get_global_param(const std::string& name) const;
+ void set_param(const std::string& name, const std::string& value);
+ std::string get_param(const std::string& name) const;
private:
typedef std::map<const std::string, elem_create_func_t> elem_create_func_map_t;
elem_create_func_map_t elem_create_func_map;
+ static elem_create_func_map_t global_elem_create_func_map;
typedef std::vector<PipeLineElem*> elem_vec_t;
elem_vec_t elems;
- typedef std::map<const std::string, std::string> global_params_map_t;
- global_params_map_t global_params_map;
+ typedef std::map<const std::string, std::string> params_map_t;
+ params_map_t params_map;
};
#endif
diff --git a/RtspFace/main.cpp b/RtspFace/main.cpp
index 738b9b1..f900b8e 100644
--- a/RtspFace/main.cpp
+++ b/RtspFace/main.cpp
@@ -7,6 +7,7 @@
#include "PL_AVFrameBGRA.h"
#include "PL_Queue.h"
#include "PL_Scale.h"
+#include "PL_Fork.h"
#include "PL_SensetimeFaceTrack.h"
@@ -20,13 +21,14 @@
PipeLine pipeLine;
- pipeLine.register_elem_creator("PL_RTSPClient", create_PL_RTSPClient);
- pipeLine.register_elem_creator("PL_RTSPServer", create_PL_RTSPServer);
- pipeLine.register_elem_creator("PL_H264Decoder", create_PL_H264Decoder);
- pipeLine.register_elem_creator("PL_AVFrameYUV420", create_PL_AVFrameYUV420);
- pipeLine.register_elem_creator("PL_H264Encoder", create_PL_H264Encoder);
- pipeLine.register_elem_creator("PL_Queue", create_PL_Queue);
- pipeLine.register_elem_creator("PL_Scale", create_PL_Scale);
+ PipeLine::register_global_elem_creator("PL_RTSPClient", create_PL_RTSPClient);
+ PipeLine::register_global_elem_creator("PL_RTSPServer", create_PL_RTSPServer);
+ PipeLine::register_global_elem_creator("PL_H264Decoder", create_PL_H264Decoder);
+ PipeLine::register_global_elem_creator("PL_AVFrameYUV420", create_PL_AVFrameYUV420);
+ PipeLine::register_global_elem_creator("PL_H264Encoder", create_PL_H264Encoder);
+ PipeLine::register_global_elem_creator("PL_Queue", create_PL_Queue);
+ PipeLine::register_global_elem_creator("PL_Scale", create_PL_Scale);
+ PipeLine::register_global_elem_creator("PL_Fork", create_PL_Scale);
pipeLine.register_elem_creator("PL_SensetimeFaceTrack", create_PL_SensetimeFaceTrack);
@@ -73,8 +75,8 @@
PL_Scale_Config config;
config.toWidth = 800;
config.toHeight = 600;
- PL_Scale* pl = (PL_Scale*)pipeLine.push_elem("PL_Scale");
- bool ret = pl->init(&config);
+ PL_Scale* ple = (PL_Scale*)pipeLine.push_elem("PL_Scale");
+ bool ret = ple->init(&config);
if (!ret)
{
LOG_ERROR << "PL_Scale.init error";
@@ -82,19 +84,34 @@
}
}
+ {
+ SensetimeFaceTrackConfig config;
+ //config.generate_face_feature = true;
+ PL_SensetimeFaceTrack* ple = (PL_SensetimeFaceTrack*)pipeLine.push_elem("PL_SensetimeFaceTrack");
+ ple->init(&config);
+ }
+
+ //PipeLine pipeLine2;
//{
- // SensetimeFaceTrackConfig config;
- // PL_SensetimeFaceTrack* pl = (PL_SensetimeFaceTrack*)pipeLine.push_elem("PL_SensetimeFaceTrack");
- // pl->init(&config);
+ // PL_Fork_Config config;
+ // config.forkBy = PL_Fork::FB_MB_TYPE;
+ // config.forkSync = PL_Fork::FS_PARALLEL;
+ // PL_Fork* ple = (PL_Fork*)pipeLine.push_elem("PL_Fork");
+ // ple->init(&config);
+ // ple->attach_pipe_line(&pipeLine2);
+ //
+ // {
+ // //pipeLine2.push_elem();
+ // }
//}
- {
- PL_DlibFaceTrack_Config config;
- config.pyramid_down_layers = 2;
- config.pyramid_down_n = 1;
- PL_DlibFaceTrack* pl = (PL_DlibFaceTrack*)pipeLine.push_elem("PL_DlibFaceTrack");
- pl->init(&config);
- }
+ //{
+ // PL_DlibFaceTrack_Config config;
+ // config.pyramid_down_layers = 2;
+ // config.pyramid_down_n = 1;
+ // PL_DlibFaceTrack* ple = (PL_DlibFaceTrack*)pipeLine.push_elem("PL_DlibFaceTrack");
+ // ple->init(&config);
+ //}
//{//#todo queue should support deep copy
// PL_Queue_Config config;
@@ -108,8 +125,9 @@
//}
{
+ PL_H264Encoder_Config config;
PL_H264Encoder* h264Encoder = (PL_H264Encoder*)pipeLine.push_elem("PL_H264Encoder");
- bool ret = h264Encoder->init(nullptr);
+ bool ret = h264Encoder->init(&config);
if (!ret)
{
LOG_ERROR << "PL_H264Encoder.init error";
diff --git a/RtspFace/main_dump_st_face.cpp b/RtspFace/main_dump_st_face.cpp
new file mode 100644
index 0000000..1285a81
--- /dev/null
+++ b/RtspFace/main_dump_st_face.cpp
@@ -0,0 +1,110 @@
+#include "PipeLine.h"
+#include "PL_RTSPClient.h"
+#include "PL_RTSPServer.h"
+#include "PL_H264Decoder.h"
+#include "PL_H264Encoder.h"
+#include "PL_AVFrameYUV420.h"
+#include "PL_AVFrameBGRA.h"
+#include "PL_Queue.h"
+#include "PL_Scale.h"
+#include "PL_Fork.h"
+
+#include "PL_SensetimeFaceTrack.h"
+
+#include "PL_DlibFaceTrack.h"
+
+#include "logger.h"
+
+int main(int argc, char** argv)
+{
+ initLogger(LV_INFO);
+
+ PipeLine pipeLine;
+
+ PipeLine::register_global_elem_creator("PL_RTSPClient", create_PL_RTSPClient);
+ //PipeLine::register_global_elem_creator("PL_RTSPServer", create_PL_RTSPServer);
+ PipeLine::register_global_elem_creator("PL_H264Decoder", create_PL_H264Decoder);
+ PipeLine::register_global_elem_creator("PL_AVFrameYUV420", create_PL_AVFrameYUV420);
+ //PipeLine::register_global_elem_creator("PL_H264Encoder", create_PL_H264Encoder);
+ //PipeLine::register_global_elem_creator("PL_Queue", create_PL_Queue);
+ PipeLine::register_global_elem_creator("PL_Scale", create_PL_Scale);
+ //PipeLine::register_global_elem_creator("PL_Fork", create_PL_Scale);
+
+ pipeLine.register_elem_creator("PL_SensetimeFaceTrack", create_PL_SensetimeFaceTrack);
+
+ {
+ PL_RTSPClient* rtspClient = (PL_RTSPClient*)pipeLine.push_elem("PL_RTSPClient");
+ PL_RTSPClient_Config rtspConfig;
+ rtspConfig.progName = argv[0];
+ rtspConfig.rtspURL = argv[1];
+ rtspConfig.aux = true; // ffmpeg need aux, but live555 not
+ rtspConfig.verbosityLevel = 1;
+ rtspConfig.tunnelOverHTTPPortNum = 0;
+ rtspConfig.args = nullptr;
+ bool ret = rtspClient->init(&rtspConfig);
+ if (!ret)
+ {
+ LOG_ERROR << "rtspClient.init error";
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ {
+ PL_H264Decoder* h264Decoder = (PL_H264Decoder*)pipeLine.push_elem("PL_H264Decoder");
+ bool ret = h264Decoder->init(nullptr);
+ if (!ret)
+ {
+ LOG_ERROR << "PL_H264Decoder.init error";
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ {
+ PL_AVFrameYUV420* avFrameYUV420 = (PL_AVFrameYUV420*)pipeLine.push_elem("PL_AVFrameYUV420");
+ bool ret = avFrameYUV420->init(nullptr);
+ if (!ret)
+ {
+ LOG_ERROR << "PL_AVFrameYUV420.init error";
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ {
+ PL_Scale_Config config;
+ config.toWidth = 800;
+ config.toHeight = 600;
+ PL_Scale* ple = (PL_Scale*)pipeLine.push_elem("PL_Scale");
+ bool ret = ple->init(&config);
+ if (!ret)
+ {
+ LOG_ERROR << "PL_Scale.init error";
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ PL_SensetimeFaceTrack* sensetimeFaceTrack;
+ {
+ SensetimeFaceTrackConfig config;
+ config.generate_face_feature = true;
+ sensetimeFaceTrack = (PL_SensetimeFaceTrack*)pipeLine.push_elem("PL_SensetimeFaceTrack");
+ sensetimeFaceTrack->init(&config);
+ }
+
+ while(true)
+ {
+ //LOG_ERROR << "begin pipe";
+
+ PipeMaterial pm;
+ if (pipeLine.pipe(&pm) == sensetimeFaceTrack);
+ sensetimeFaceTrack->gain(pm);
+
+ if (pm.type == PipeMaterial::PMT_PM_LIST)
+ {
+ PipeMaterial& facePM = ((PipeMaterial*)(pm.buffer))[1];
+ st_ff_vect_t& faceFeatures = *((st_ff_vect_t*)facePM.buffer);
+ LOG_NOTICE << "faceFeatures " << faceFeatures.size();
+ }
+
+ //LOG_ERROR << "end pipe";
+ }
+}
diff --git a/RtspFace/make.sh b/RtspFace/make.sh
index c15d0d2..05baf7f 100644
--- a/RtspFace/make.sh
+++ b/RtspFace/make.sh
@@ -46,7 +46,8 @@
rm rtsp_face
rm *.o
-g++ main.cpp $CFLAGS $CPPFLAGS
+#g++ main.cpp $CFLAGS $CPPFLAGS -o main.o
+g++ main_dump_st_face.cpp $CFLAGS $CPPFLAGS -o main.o
g++ PipeLine.cpp $CFLAGS $CPPFLAGS
g++ PL_RTSPClient.cpp $CFLAGS $CPPFLAGS
@@ -57,6 +58,7 @@
g++ PL_AVFrameBGRA.cpp $CFLAGS $CPPFLAGS
g++ PL_Queue.cpp $CFLAGS $CPPFLAGS
g++ PL_Scale.cpp $CFLAGS $CPPFLAGS
+g++ PL_Fork.cpp $CFLAGS $CPPFLAGS
g++ PL_SensetimeFaceTrack.cpp $CFLAGS $CPPFLAGS
@@ -68,7 +70,7 @@
g++ -g -std=c++11 \
main.o PipeLine.o \
- PL_RTSPClient.o PL_H264Decoder.o PL_H264Encoder.o PL_AVFrameYUV420.o PL_AVFrameBGRA.o PL_Queue.o PL_Scale.o \
+ PL_RTSPClient.o PL_H264Decoder.o PL_H264Encoder.o PL_AVFrameYUV420.o PL_AVFrameBGRA.o PL_Queue.o PL_Scale.o PL_Fork.o \
PL_SensetimeFaceTrack.o \
PL_DlibFaceTrack.o \
$FFMPEGRTSPSERVER_OBJ PL_RTSPServer.o \
--
Gitblit v1.8.0