From 6e1fff143f2669f7771301d583fff99de7995cdd Mon Sep 17 00:00:00 2001
From: xuxiuxi <554325746@qq.com>
Date: 星期二, 05 三月 2019 09:21:02 +0800
Subject: [PATCH] Merge branch 'yw.1.2.fixbug' of http://192.168.1.226:10010/r/development/c++ into yw.1.2.fixbug

---
 QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.h             |    2 
 QiaoJiaSystem/DataManagerServer/CMakeLists.txt                   |    2 
 QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h             |  248 ++++++
 QiaoJiaSystem/GB28181DecoderModel/SpinLock.hpp                   |   30 
 QiaoJiaSystem/LocalDBTool/SqliteFaceEncap.h                      |   76 ++
 QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp |  210 +++++
 QiaoJiaSystem/GB28181DecoderModel/main.cpp                       |  123 +++
 syncDBTool/ErlangDbTool.cpp                                      |  150 +++
 QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp            |   59 
 QiaoJiaSystem/YoloServer/main.cpp                                |    4 
 QiaoJiaSystem/GB28181DecoderModel/CMakeLists.txt                 |  101 ++
 QiaoJiaSystem/DataManagerServer/http_configserver.cpp            |   89 +
 QiaoJiaSystem/GB28181DecoderModel/GB28181Server.cpp              |   56 +
 QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h   |   94 ++
 syncDBTool/ErlangDbTool.h                                        |   29 
 QiaoJiaSystem/GB28181DecoderModel/GlobalSignalWaitLock.hpp       |  115 +++
 QiaoJiaSystem/LocalDBTool/SqliteFaceEncap.cpp                    |   13 
 syncDBTool/SyncDB.hpp                                            |   35 
 QiaoJiaSystem/CMakeLists.txt                                     |    7 
 QiaoJiaSystem/GB28181DecoderModel/GB28181Server.h                |   93 ++
 QiaoJiaSystem/LocalDBTool/SqliteToolkit.hpp                      |  118 ++
 QiaoJiaSystem/VideoToImageMulth/RtspImageRedis.h                 |    2 
 QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp           |  536 ++++++++++++++
 23 files changed, 2,104 insertions(+), 88 deletions(-)

diff --git a/QiaoJiaSystem/CMakeLists.txt b/QiaoJiaSystem/CMakeLists.txt
index 5aad5c3..a2e7f1d 100644
--- a/QiaoJiaSystem/CMakeLists.txt
+++ b/QiaoJiaSystem/CMakeLists.txt
@@ -12,8 +12,14 @@
     ./
     ../../BasicPlatForm/
     ../../BasicPlatForm/libs/jsoncpp/include
+    ../../BasicPlatForm/libs/glog/include
     ../../BasicPlatForm/libs/opencv/include
     ../../BasicPlatForm/libs/libuuid/include
+)
+
+
+link_directories(
+    ../../BasicPlatForm/libs/glog/lib
 )
 
 #add_subdirectory(StructureApp)
@@ -28,5 +34,6 @@
 #add_subdirectory(VideoToImage)
 add_subdirectory(UnitTest)
 add_subdirectory(VideoToImageMulth)
+add_subdirectory(GB28181DecoderModel)
 #add_subdirectory(FaceSearchDbWithImg)
 
diff --git a/QiaoJiaSystem/DataManagerServer/CMakeLists.txt b/QiaoJiaSystem/DataManagerServer/CMakeLists.txt
index e36f449..d6a2220 100644
--- a/QiaoJiaSystem/DataManagerServer/CMakeLists.txt
+++ b/QiaoJiaSystem/DataManagerServer/CMakeLists.txt
@@ -154,7 +154,7 @@
     HCCore
     hcnetsdk
     pthread
-    mysqlpp
+#    mysqlpp
     )
 
 #add_executable(Apptest
diff --git a/QiaoJiaSystem/DataManagerServer/http_configserver.cpp b/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
index aa68798..8aea381 100644
--- a/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
+++ b/QiaoJiaSystem/DataManagerServer/http_configserver.cpp
@@ -1063,6 +1063,7 @@
         rec.str_username = QString::fromStdString(value["str_username"].asString());
         rec.str_password = QString::fromStdString(value["str_password"].asString());
         rec.str_brand = QString::fromStdString(value["str_brand"].asString());
+        rec.str_reserved = QString::fromStdString(value["str_reserved"].asString());
         type = value["n_type"].asInt();
 //        rec_sdk_old = db_c.searchCamSdkTableByCamId(rec.str_cam_dev_id);
 
@@ -1876,31 +1877,87 @@
 //    bool ret = false;
 
     if (reader.parse(content, value)) {
+        std::string Uuid = value["uuid"].asString();
         std::string TableType = value["TableType"].asString();
         std::string TableName = value["TableName"].asString();
         int SyncType = atoi(value["SyncType"].asCString());
         std::string BwType = value["BwType"].asString();
         std::string StartTime = value["StartTime"].asString();
         std::string EndTime = value["EndTime"].asString();
+
+        std::string UploadFlag = value["IsSync"].asString();
+        UploadFlag = UploadFlag.empty() ? "0" : UploadFlag;
+        std::string CmpThreshold = value["threshold"].asString();
+        CmpThreshold = CmpThreshold.empty() ? "60" : CmpThreshold;
+        std::string Enabled = value["enabled"].asString();
+        Enabled = Enabled.empty() ? "1" : Enabled;
+
+        std::string createBy = value["createBy"].asString();
+
+        string str_uuid;
+        uuid_t t_uuid;
+        char str[36];
+        uuid_generate(t_uuid);
+        uuid_unparse(t_uuid, str);
+        str_uuid = str;
+        Uuid = Uuid.empty() ? str_uuid : Uuid;
+//        if (createBy == "analyDev") {
+//            Uuid = Uuid.empty() ? str_uuid : Uuid;
+//        } else if (createBy == "conCemter") {
+//            if (Uuid.empty()) {
+//                response->write(SimpleWeb::StatusCode::client_error_bad_request, "{\"error\":\"鍙傛暟閿欒锛� \"}");
+//                return "";
+//            }
+//        }
+
+
         bool ret = false;
-        if (SyncType == 1) {
-            //鍚屾搴�
-            ret = erlangDbTool->createDatabase(TableType, TableName, SyncType, BwType, StartTime, EndTime);
-        } else if (SyncType == 0) {
-            TableName.insert(0, "lt_");
-            //鏈湴搴�
-            FieldValues fieldValues;
-            fieldValues.insert(std::make_pair("uuid", GetUUId::getUUID()));
-            fieldValues.insert(std::make_pair("tableName", TableName));
-            fieldValues.insert(std::make_pair("tableDesc", "ceshi"));
-            fieldValues.insert(std::make_pair("tableType", TableType));
-            fieldValues.insert(std::make_pair("bwType", BwType));
-            fieldValues.insert(std::make_pair("startTime", StartTime));
-            fieldValues.insert(std::make_pair("endTime", EndTime));
-            fieldValues.insert(std::make_pair("create_by", "who"));
-            ret = m_SqliteFaceEncap.createTable(TableName, fieldValues);
+        FieldValues fieldValues;
+        fieldValues.insert(std::make_pair("uuid", Uuid));
+        fieldValues.insert(std::make_pair("tableName", TableName));
+        fieldValues.insert(std::make_pair("tableDesc", "ceshi"));
+        fieldValues.insert(std::make_pair("tableType", TableType));
+        fieldValues.insert(std::make_pair("bwType", BwType));
+        fieldValues.insert(std::make_pair("startTime", StartTime));
+        fieldValues.insert(std::make_pair("endTime", EndTime));
+//        #todo
+        fieldValues.insert(std::make_pair("create_by", createBy));
+
+        fieldValues.insert(std::make_pair("uploadFlag", UploadFlag));
+        fieldValues.insert(std::make_pair("cmpThreshold", CmpThreshold));
+        fieldValues.insert(std::make_pair("enabled", Enabled));
+
+
+        if (TableType == "person") {
+            if (SyncType == 1) {
+                //鍚屾搴�
+                ret = erlangDbTool->createDatabase(Uuid, fieldValues);
+            } else if (SyncType == 0) {
+                TableName.insert(0, "lt_");
+                //鏈湴搴�
+                ret = m_SqliteFaceEncap.createTable(TableName, fieldValues);
+            }
+        } else if (TableType == "car") {
+            ERR(" not not_implemented");
+            response->write(SimpleWeb::StatusCode::server_error_not_implemented, "{\"error\":\"绫诲瀷閿欒锛屾湭瀹炵幇锛� \"}");
+            return "";
+        } else {
+            response->write(SimpleWeb::StatusCode::server_error_not_implemented, "{\"error\":\"绫诲瀷閿欒锛屾湭璇嗗埆锛� \"}");
+            return "";
         }
 
+
+////            #todo 涓婁紶銆備粎榛戝悕鍗曘��
+////            #TODO 鏍规嵁createBy鍒ゆ柇鏄惁闇�瑕佷笂浼�
+//        if (createBy == "analyDev" && BwType == "1") {
+////            string &Uuid, string &TableName, string &SyncType, string &StartTime,string &EndTime,
+////            string &UploadFlag, string &CmpThreshold, string &Enabled
+//            string str_SyncType(to_string(SyncType));
+//            UploadTaskToMonitorCenter(Uuid, TableName, str_SyncType, StartTime, EndTime, UploadFlag, CmpThreshold,
+//                                      Enabled);
+//        }
+
+
         erlangDbTool->sendMessage();
         std::string str_result = std::string("{\"result\":").append("\"" + std::to_string(ret) + "\"}");
         return str_result;
diff --git a/QiaoJiaSystem/GB28181DecoderModel/CMakeLists.txt b/QiaoJiaSystem/GB28181DecoderModel/CMakeLists.txt
new file mode 100644
index 0000000..5d5dd38
--- /dev/null
+++ b/QiaoJiaSystem/GB28181DecoderModel/CMakeLists.txt
@@ -0,0 +1,101 @@
+cmake_minimum_required(VERSION 3.5)
+
+STRING(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR})
+project(${CURRENT_FOLDER})
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_BUILD_TYPE debug)
+add_compile_options(-fPIC)
+add_definitions(-DGLOG)
+#add_definitions(-DTestCode)
+add_definitions(-DDEBUG_ERR -DDEBUG_INFO -fpermissive)
+
+set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../build)
+set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../build)
+
+# packages
+#find_package(CUDA)
+
+#include_directories ("${PROJECT_SOURCE_DIR}")
+
+# nvcc flags
+#set(CUDA_NVCC_FLAGS -O3;-G;-g)
+#set(CUDA_NVCC_FLAGS -gencode arch=compute_20,code=sm_20;-G;-g)
+#set(CUDA_NVCC_FLAGS -gencode arch=compute_52,code=sm_52;-G;-g)
+
+#file(GLOB_RECURSE CURRENT_HEADERS *.h *.hpp *.cuh)
+#file(GLOB CURRENT_SOURCES *.cpp *.cu)
+
+#source_group("Include" FILES ${CURRENT_HEADERS})
+#source_group("Source" FILES ${CURRENT_SOURCES})
+
+#cuda_add_executable(${PROJECT_NAME} ${CURRENT_HEADERS} ${CURRENT_SOURCES})
+#cuda_add_library(${PROJECT_NAME} SHARED ${CURRENT_HEADERS} ${CURRENT_SOURCES})
+#cuda_add_library(${PROJECT_NAME} STATIC ${CURRENT_HEADERS} ${CURRENT_SOURCES})
+
+SET(SOURCES
+
+    GlobalSignalWaitLock.hpp
+    )
+
+SET(LIBS
+    glog
+    avformat
+    avcodec
+    swresample
+    swscale
+    avutil
+    bz2 dl z
+
+    Qt5Core
+    opencv_world
+
+    28181sdk
+    mysqlclient
+    StreamParse
+    pthread
+    )
+
+include_directories(
+
+    #glog
+    ../../../BasicPlatForm/libs/glog/include
+    ../../../BasicPlatForm/libs/GB28181/include
+
+    ../../../BasicPlatForm/libs/opencv/include
+    ../../../BasicPlatForm/libs/ffmpeg/include
+    ../../../BasicPlatForm/basic/util/opencv/
+    ../../../BasicPlatForm/basic/debug/
+    ../../../BasicPlatForm/
+    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/
+
+    /usr/include/x86_64-linux-gnu/qt5
+
+)
+
+link_directories(
+    #glog
+    /usr/local/lib/
+
+    #glog
+    ../../../BasicPlatForm/libs/glog/lib
+    ../../../BasicPlatForm/libs/GB28181/libs
+    ../../../BasicPlatForm/libs/opencv/lib
+    ../../../BasicPlatForm/libs/ffmpeg/lib
+
+)
+
+add_executable(${PROJECT_NAME}
+    #    testmain.cpp
+    main.cpp
+
+    ./GB28181Server.cpp
+    ./FFmpegDecoderJPG.cpp
+    VideoCaptureElementWithRtp.cpp
+    ../../../BasicPlatForm/basic/timer_counter/Clocktimer.cpp
+
+    ${SOURCES}
+    )
+
+target_link_libraries(${PROJECT_NAME}
+    ${LIBS}
+    )
diff --git a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
new file mode 100644
index 0000000..ebf1de9
--- /dev/null
+++ b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
@@ -0,0 +1,536 @@
+//
+// Created by ps on 19-1-11.
+//
+
+#include <zconf.h>
+#include <opencv2/opencv.hpp>
+#include "FFmpegDecoderJPG.h"
+
+void BASICGB28181::initFFmpeg() {
+    av_register_all();
+    avformat_network_init();
+}
+
+static bool initFFmpegRet = (BASICGB28181::initFFmpeg(), true);
+
+//MyQueue<BASICGB28181::frameBuffInfo *>  BASICGB28181::FFmpegDecoderJPG::m_rtpQueue;
+//cv::Mat BASICGB28181::FFmpegDecoderJPG::m_image;
+
+cv::Mat BASICGB28181::avframe_to_cvmat(AVFrame *frame) {
+    AVFrame dst;
+    memset(&dst, 0, sizeof(dst));
+    int w = frame->width, h = frame->height;
+    cv::Mat m = std::move(cv::Mat(h, w, CV_8UC3));
+    dst.data[0] = (uint8_t *) m.data;
+    avpicture_fill((AVPicture *) &dst, dst.data[0], AV_PIX_FMT_BGR24, w, h);
+    struct SwsContext *convert_ctx = NULL;
+//    PixelFormat src_pixfmt = (enum PixelFormat) frame->format;
+//    PixelFormat dst_pixfmt = AV_PIX_FMT_BGR24;
+    convert_ctx = sws_getContext(w, h, frame->format, w, h, AV_PIX_FMT_BGR24,
+                                 SWS_FAST_BILINEAR, NULL, NULL, NULL);
+    sws_scale(convert_ctx, frame->data, frame->linesize, 0, h,
+              dst.data, dst.linesize);
+    sws_freeContext(convert_ctx);
+
+    DBG("m.size is " << m.size());
+
+    return m;
+}
+
+
+BASICGB28181::FFmpegDecoderJPG::FFmpegDecoderJPG() : m_buf_size(32768), m_running(false), m_PackageState(false),
+                                                     m_readData(false), m_rtpQueue(), frame_number(0),
+                                                     first_frame_number(-1) {
+}
+
+BASICGB28181::FFmpegDecoderJPG::~FFmpegDecoderJPG() {
+
+    while (m_rtpQueue.count_queue()) {
+        m_rtpQueue.popNotWait();
+    }
+
+}
+
+bool BASICGB28181::FFmpegDecoderJPG::pushInfo(unsigned char *data, int datalen, const std::string &camIdx) {
+    TryCath(
+        if (!m_running) {
+            ERR(" m_running is false");
+            return false;
+        }
+#ifdef TestCode
+        DBG(camIdx << " dataLen is " << datalen);
+#endif
+        frameBuffInfo *info = new frameBuffInfo();
+        info->buff = new unsigned char[datalen];
+        info->buffLen = datalen;
+        info->camIdx = camIdx;
+        memcpy(info->buff, data, datalen);
+#ifdef TestCode
+        DBG(" m_rtpQueue.push before ");
+#endif
+        m_rtpQueue.push(info);
+#ifdef TestCode
+        DBG(" m_rtpQueue.push after ");
+#endif
+    );
+    return true;
+}
+
+int BASICGB28181::FFmpegDecoderJPG::read_data(void *opaque, uint8_t *buf, int bufsize) {
+#ifdef TestCode
+    ClockTimer cl("read_data");
+#endif
+    FFmpegDecoderJPG *fFmpegDecoderJPG = (FFmpegDecoderJPG *) opaque;
+    int len = bufsize;
+    int diff = 0;
+    do {
+
+//        DBG(" m_rtpQueue.pop before ");
+        frameBuffInfo *buffinfo = fFmpegDecoderJPG->m_rtpQueue.pop();
+//        DBG(" m_rtpQueue.pop after ");
+        diff = len - buffinfo->buffLen;
+//        printf("bufsize is :%ld,len is :%ld, datalen:%d \n", bufsize, len, buffinfo->buffLen);
+        //甯ч暱澶т簬bufsize
+        if (diff < 0) {
+//            DBG("/甯ч暱澶т簬bufsize" << diff);
+            memcpy(buf + bufsize - len, buffinfo->buff, len);
+
+            frameBuffInfo *info = new frameBuffInfo();
+            info->buffLen = buffinfo->buffLen - len;
+            info->buff = new uint8_t[buffinfo->buffLen - len]{};
+            memcpy(info->buff, buffinfo->buff + len, buffinfo->buffLen - len);
+
+            fFmpegDecoderJPG->m_rtpQueue.push_front_one(info);
+            fFmpegDecoderJPG->m_PackageState = true;
+        } else if (diff == 0) {
+//            DBG("/甯ч暱绛変簬bufsize" << diff);
+            memcpy(buf + bufsize - len, buffinfo->buff, buffinfo->buffLen);
+            fFmpegDecoderJPG->m_PackageState = false;
+        } else if (diff > 0) {
+//            DBG("/甯ч暱灏忎簬bufsize" << diff);
+            memcpy(buf + bufsize - len, buffinfo->buff, buffinfo->buffLen);
+            len = len - buffinfo->buffLen;   //杩橀渶瑕佸~鍏呯殑澶у皬
+            memset(buf + bufsize - len, 0, len);
+//            if (fFmpegDecoderJPG->m_PackageState) {
+            //涓嶇瓑寰呭~鍏咃紝鐩存帴杩涜瑙g爜
+            diff = 0;
+            fFmpegDecoderJPG->m_PackageState = false;
+//            }
+        }
+        delete[] buffinfo->buff;
+        delete buffinfo;
+    } while (diff > 0);
+    //#todo 瑙﹀彂淇″彿
+//    DBG("emitSigal(\"read_dataOk\") begin");
+//    gSignalLock.emitSigal("read_dataOk");
+    fFmpegDecoderJPG->m_readData = true;
+//    DBG("emitSigal(\"read_dataOk\") after");
+    return bufsize;
+}
+
+void BASICGB28181::FFmpegDecoderJPG::BareFlowDecoderThd(FFmpegDecoderJPG *p_this) {
+    DBG(p_this->m_camIdx << "  BareFlowDecoderThd ok ... gpuIdx is " << p_this->m_gpuIdx);
+    p_this->m_running = true;
+    av_register_all();
+    avformat_network_init();
+    AVFormatContext *ic = avformat_alloc_context();
+
+    unsigned char *iobuffer = (unsigned char *) av_malloc(p_this->m_buf_size);
+    AVIOContext *avio = avio_alloc_context(iobuffer, p_this->m_buf_size, 0, p_this, p_this->read_data, NULL, NULL);
+    ic->pb = avio;
+
+    int err = av_probe_input_buffer(ic->pb, &ic->iformat, nullptr, nullptr, 0, p_this->m_buf_size);
+    int err1 = avformat_open_input(&ic, "", NULL, NULL);
+    int err2 = avformat_find_stream_info(ic, nullptr);
+    int vi = -1;
+    for (int i = 0; i < ic->nb_streams; ++i) {
+        if (ic->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
+            vi = i;
+            break;
+        }
+    }
+    AVStream *stream = ic->streams[vi];
+    p_this->video_st = stream;
+    AVCodecContext *ctx = avcodec_alloc_context3(nullptr);
+    int err3 = avcodec_parameters_to_context(ctx, stream->codecpar);
+
+    AVCodec *codec = avcodec_find_decoder(ctx->codec_id);
+    //鏄惁鍚敤GPU
+    if (p_this->m_gpuIdx >= 0) {
+        if (codec != NULL) {
+            char cuvidName[40] = {0};
+            sprintf(cuvidName, "%s_cuvid", codec->name);
+            if (!strcmp(codec->name, "h264") || !strcmp(codec->name, "h265") || !strcmp(codec->name, "hevc")) {
+                AVCodec *codec_cuvid = avcodec_find_decoder_by_name(cuvidName);
+                if (codec_cuvid != NULL) {
+                    codec = codec_cuvid;
+                } else {
+//                    return false;
+                    ERR("codec_cuvid is NULL");
+                }
+            }
+        }
+    }
+    int err4 = avcodec_open2(ctx, codec, nullptr);
+
+    AVPacket pkt;
+    av_init_packet(&pkt);
+
+    AVFrame *frame = av_frame_alloc();
+    unsigned int usleepTime = (1000 / p_this->m_fps) - 12;
+    usleepTime *= 1000;
+    DBG(" before while <<usleepTime is " << usleepTime);
+    while (p_this->m_running) {
+#ifdef TestCode
+        ClockTimer Test("while time");
+#endif
+        int err5 = av_read_frame(ic, &pkt);
+        //# todo save package
+        p_this->frame_number++;
+
+        //DBG("GotPicture "<<m_camId<<":"<<frame_number);
+        //鏀惧湪姝ゅ鏄洜涓轰箣鍓嶆斁鍦ㄥ墠闈�,鏀跺埌鐨勫抚涓嶅畬鎴�
+        p_this->SaveToPacketVector(pkt);
+        p_this->CheckSave();
+
+        int err6 = avcodec_send_packet(ctx, &pkt);
+        av_packet_unref(&pkt);
+        int err7 = avcodec_receive_frame(ctx, frame);
+        if ((err7 == AVERROR(EAGAIN)) || (err5 < 0) || (err6 < 0)) {
+            ERR(" error << err7:" << err7 << "  err5: " << err5 << " err6: " << err6);
+            usleep(40000);
+            continue;
+        }
+//        BASICGB28181::avframe_to_cvmat(frame).copyTo(p_this->m_image);
+        p_this->m_image = std::move(BASICGB28181::avframe_to_cvmat(frame));
+
+#ifdef TestCode
+        {
+//            TestCode
+            ClockTimer cl("TestCode");
+            std::string strNewTime2 = AppUtil::getTimeUSecString();
+            cv::putText(p_this->m_image, strNewTime2, cv::Point(408, 540), cv::HersheyFonts::FONT_HERSHEY_PLAIN,
+                        5, cv::Scalar(255, 255, 0), 2);
+            std::thread test([&](cv::Mat img, std::string strThing) {
+                try {
+                    std::string strNewTime = "tmpDec/";
+                    strNewTime.append(p_this->m_camIdx + "_").append(strThing).append(".jpg");
+//                    cv::imwrite(strNewTime, p_this->m_image);
+                } catch (std::exception ex) {
+                    ERR(ex.what());
+                }
+            }, p_this->m_image, strNewTime2);
+            test.detach();
+        }
+#endif
+
+        //#todo send to other thd
+#ifdef TestCode
+        DBG("emitSigal(\"DecoderImageOK\") begin");
+#endif
+
+        gSignalLock.emitSigal(p_this->m_camIdx + "DecoderImageOK");
+//#ifdef TestCode
+//        DBG("emitSigal(\"DecoderImageOK\") after");
+//#endif
+
+        DBG("emitSigal(\"DecoderImageOK\") after");
+        DBG("p_this->m_camIdx is " << p_this->m_camIdx << " queue size is " << p_this->m_rtpQueue.count_queue());
+
+#ifdef TestCode
+        {
+            ClockTimer cl("waitTime");
+            int loop = 0;
+            //#TODO
+//            while ((loop++ < 3000) && !(p_this->m_readData)) {
+//                usleep(10);
+//            }
+
+            usleep(30000);
+            DBG("p_this->m_readData is " << p_this->m_readData << "  loop is " << loop << " queue size is "
+                                         << p_this->m_rtpQueue.count_queue());
+            p_this->m_readData = false;
+//        usleep(12000);
+        }
+#else
+        usleep(usleepTime);
+#endif
+
+    }
+    DBG(" after while ");
+    av_frame_free(&frame);
+}
+
+bool BASICGB28181::FFmpegDecoderJPG::startThd(const std::string &camIdx, const int &fps, const int &gpuIdx) {
+    TryCath(
+        DBG(camIdx << "  FFmpegDecoderJPG startThd ... gpuIdx is " << gpuIdx);
+        m_gpuIdx = gpuIdx;
+        m_fps = fps;
+        if (gpuIdx >= 0) {
+            setenv("CUDA_VISIBLE_DEVICES", std::to_string(gpuIdx).c_str(), 0);
+        }
+        m_camIdx = camIdx;
+        std::thread t_BareFlowDecoder(BareFlowDecoderThd, this);
+        t_BareFlowDecoder.detach();
+    );
+    return true;
+}
+
+bool BASICGB28181::FFmpegDecoderJPG::stopThd() {
+    TryCath(
+        DBG(m_camIdx << "  FFmpegDecoderJPG stopThd ... ");
+        m_running = false;
+    );
+    return true;
+}
+
+bool BASICGB28181::FFmpegDecoderJPG::getRunning() {
+    return m_running;
+}
+
+cv::Mat BASICGB28181::FFmpegDecoderJPG::getImage() {
+    return m_image;
+}
+
+std::string BASICGB28181::FFmpegDecoderJPG::GetImageName() {
+    ImageName_s_t st;
+    st.m_camId = this->m_camIdx;
+    st.m_frameId = this->m_frameIndex;
+    st.m_timeStamp = AppUtil::GetTimeWithHyphen();
+    return st.toString();
+}
+
+bool BASICGB28181::FFmpegDecoderJPG::SaveVideoByImageName(const std::string &strPath, const std::string &imageName) {
+    DBG(" strPath is " << strPath << "  imageName " << imageName);
+    ImageName_s_t imgName_s = ImageName_s_t::fromString(imageName);
+    if (!imgName_s.Valid()) {
+        ERR("Image Name Valid  " << imageName);
+        return false;
+    }
+
+    m_videoPath = strPath;
+    if (m_recordState == STOP_RECORD) {
+        m_recordState = RECORDING_VIDEO;
+        m_startFrameId = m_endFrameId = imgName_s.m_frameId;
+    } else {
+        if (imgName_s.m_frameId > m_endFrameId) {
+            m_endFrameId = imgName_s.m_frameId;
+        }
+    }
+
+    if (!m_packetsVec.empty()) {
+        if (imgName_s.m_frameId < m_packetsVec[0].m_frameId) {
+            ERR("Save Video Failed: PackageFirstID: " << m_packetsVec[0].m_frameId << " ImageId: "
+                                                      << imgName_s.m_frameId);
+        }
+    }
+    return true;
+}
+
+bool BASICGB28181::FFmpegDecoderJPG::SetMinMaxVideoSeconds(const int minSeconds, const int maxSecond) {
+    if (minSeconds < 0 || maxSecond < 0 && minSeconds >= maxSecond) {
+        return false;
+    } else {
+        m_minVideoFrameCount = minSeconds * 25;
+        m_maxVideoFrameCount = maxSecond * 25;
+        return true;
+    }
+}
+
+bool BASICGB28181::FFmpegDecoderJPG::CleanToFrameId(int64_t lastFrameId) {
+    std::lock_guard<std::mutex> lock(g_mutex);
+    if (RECORDING_VIDEO == m_recordState) {
+        if (!m_packetsVec.empty()) {
+            auto iter = m_packetsVec.begin();
+            while (iter->m_frameId < lastFrameId) {
+                INFO("DropFrame: " << iter->m_frameId);
+                delete iter->m_packet.data;
+                iter = m_packetsVec.erase(iter);
+            }
+        }
+    }
+    return true;
+}
+
+bool BASICGB28181::FFmpegDecoderJPG::CleanOneKeyFrameOneRange() {
+    std::lock_guard<std::mutex> lock(g_mutex);
+    if (!m_packetsVec.empty() && STOP_RECORD == m_recordState) {
+        auto firstFrame = m_packetsVec[0];
+        //瑙嗛鐨勬渶鐭暱搴︽湁闂,鍙互鑰冭檻淇敼姝ゅ m_minVideoFrameCount
+        if ((m_last_I_FrameId - firstFrame.m_frameId > m_minVideoFrameCount / 2)) {
+            auto iter = m_packetsVec.begin();
+            delete iter->m_packet.data;
+            iter = m_packetsVec.erase(iter);
+            while (!(iter->m_packet.flags & AV_PKT_FLAG_KEY)) {
+//                INFO("DropFrame: " << iter->m_frameId);
+                delete iter->m_packet.data;
+                iter = m_packetsVec.erase(iter);
+            }
+        }
+    }
+    return true;
+}
+
+bool BASICGB28181::FFmpegDecoderJPG::SaveVideo(std::string path, int64_t lastFrameId) {
+    std::lock_guard<std::mutex> lock(g_mutex);
+    INFO("SaveVideo: " << path);
+    if (!m_packetsVec.empty()) {
+        startWrite(path.c_str());
+        int64_t firstKeyFramePts = m_packetsVec[0].m_packet.pts;
+        int64_t firstKeyFrameDts = m_packetsVec[0].m_packet.dts;
+        for (const auto &item:m_packetsVec) {
+            if (item.m_frameId < lastFrameId) {
+                conversion(const_cast<AVPacket *> (&item.m_packet), firstKeyFramePts, firstKeyFrameDts, video_st);
+                av_write_frame(m_pOutFmtCtx, &item.m_packet);
+            } else {
+                break;
+            }
+        }
+        stopWrite();
+    }
+    return true;
+}
+
+bool BASICGB28181::FFmpegDecoderJPG::HandleSave() {
+    if (m_recordState == RECORDING_VIDEO) {
+        auto firstFrame = m_packetsVec[0];
+        VideoName_s_t st;
+        st.m_camId = m_camIdx;
+        st.m_timeStamp = AppUtil::GetTimeWithHyphen();
+        st.m_startFrameId = firstFrame.m_frameId;
+        st.m_endFrameId = m_last_I_FrameId - 1;
+        //缁撳熬鐣欑殑宸茬粡瓒冲,骞朵笖娌℃湁鏂扮殑甯ч渶瑕佸綍鍍�
+        if (m_last_I_FrameId - m_endFrameId > m_minVideoFrameCount / 2) {
+//            INFO("LastIFrameID: " << m_last_I_FrameId << "  FirstFrameID: " << st.m_startFrameId << " m_endFrameID: "
+//                                  << m_endFrameId << "   MinVideoFrameCount :" << m_minVideoFrameCount);
+            m_startFrameId = m_endFrameId = -1;
+
+            SaveVideo(m_videoPath + st.ToVideoName(), m_last_I_FrameId);
+            CleanToFrameId(m_last_I_FrameId);
+            m_recordState = STOP_RECORD;
+        } else {
+            //缂撳啿鍖轰腑宸茬粡鏈夊お澶氱殑甯т簡,骞朵笖鍓╀綑鐨勫湪缂撳啿闃熷垪鐨刴_last_I_FrameId涔嬪悗杩樻湁闇�瑕佸綍鍍忕殑甯�
+            if (m_endFrameId - firstFrame.m_frameId > m_maxVideoFrameCount) {
+//                INFO("FirstFrameID: " << firstFrame.m_frameId << " m_endFrameID: " << m_endFrameId
+//                                      << "   MinVideoFrameCount :" << m_maxVideoFrameCount);
+                m_startFrameId = m_last_I_FrameId;
+                SaveVideo(m_videoPath + st.ToVideoName(), m_last_I_FrameId);
+                CleanToFrameId(m_last_I_FrameId);
+            }
+        }
+    }
+    return true;
+}
+
+bool BASICGB28181::FFmpegDecoderJPG::CheckSave() {
+    if (!m_packetsVec.empty()) {
+        if (RECORDING_VIDEO == m_recordState) {
+            HandleSave();
+            return true;
+        }
+        return CleanOneKeyFrameOneRange();
+    }
+}
+
+void BASICGB28181::FFmpegDecoderJPG::SaveToPacketVector(AVPacket &packet) {
+    AVPacket newPacket(packet);
+    newPacket.data = reinterpret_cast<uint8_t *>(new uint64_t[
+    (packet.size + FF_INPUT_BUFFER_PADDING_SIZE) / sizeof(uint64_t) + 1]);
+    memcpy(newPacket.data, packet.data, packet.size);
+    m_frameIndex++;
+    m_packetsVec.push_back({m_frameIndex, newPacket});
+    if (newPacket.flags & AV_PKT_FLAG_KEY) {
+        m_last_I_FrameId = m_frameIndex;
+    }
+}
+
+int BASICGB28181::FFmpegDecoderJPG::startWrite(const char *filename) {
+    if (video_st == nullptr) {
+        printf("video_st instream is null");
+        return -1;
+    }
+    int ret = avformat_alloc_output_context2(&m_pOutFmtCtx, NULL, NULL, filename);
+    if (ret < 0) {
+        fprintf(stderr, "avformat_alloc_output_context2 failed, errorCode: %d\n", AVERROR(ret));
+        return -1;
+    }
+    /*
+    * since all input files are supposed to be identical (framerate, dimension, color format, ...)
+    * we can safely set output codec values from first input file
+    */
+    m_pOutVideo_stream = avformat_new_stream(m_pOutFmtCtx, NULL);
+    {
+//        AVCodecContext *c;
+//        c = m_pOutVideo_stream->codec;
+//        c->bit_rate = 400000;
+//        c->codec_id = video_st->codec->codec_id;
+//        c->codec_type = video_st->codec->codec_type;
+//        c->time_base.num = video_st->time_base.num;
+//        c->time_base.den = video_st->time_base.den;
+//        fprintf(stderr, "time_base.num = %d time_base.den = %d\n", c->time_base.num, c->time_base.den);
+//        c->width = video_st->codec->width;
+//        c->height = video_st->codec->height;
+//        c->pix_fmt = video_st->codec->pix_fmt;
+//        printf("%d %d %d", c->width, c->height, c->pix_fmt);
+//        c->flags = video_st->codec->flags;
+//        c->flags |= CODEC_FLAG_GLOBAL_HEADER;
+//        c->me_range = video_st->codec->me_range;
+//        c->max_qdiff = video_st->codec->max_qdiff;
+//
+//        c->qmin = video_st->codec->qmin;
+//        c->qmax = video_st->codec->qmax;
+//
+//        c->qcompress = video_st->codec->qcompress;
+    }
+    ret = avio_open(&m_pOutFmtCtx->pb, filename, AVIO_FLAG_WRITE);
+    if (ret < 0) {
+        fprintf(stderr, "could not find stream info, errorCode: %d\n", AVERROR(ret));
+        return -1;
+    }
+
+    avformat_write_header(m_pOutFmtCtx, NULL);
+
+    m_bstartWrite = true;
+    m_bFirstKeyFrame = true;
+    m_nFirstKeyDts = 0;
+    m_nFirstKeyPts = 0;
+
+    return 0;
+}
+
+int BASICGB28181::FFmpegDecoderJPG::stopWrite() {
+    if (m_pOutFmtCtx == nullptr) return -1;
+    av_write_trailer(m_pOutFmtCtx);
+    avio_close(m_pOutFmtCtx->pb);
+    avcodec_close(m_pOutFmtCtx->streams[0]->codec);
+    av_freep(&m_pOutFmtCtx->streams[0]->codec);
+    av_freep(&m_pOutFmtCtx->streams[0]);
+
+    av_free(m_pOutFmtCtx);
+    m_pOutFmtCtx = nullptr;
+    m_bstartWrite = false;
+    return 0;
+}
+
+
+void BASICGB28181::FFmpegDecoderJPG::conversion(void *packet, const long int &firstKeyPts, const long int &firstKeyDts,
+                                                void *inVideoStream) {
+    if ((packet != nullptr) && (inVideoStream != nullptr)) {
+        AVStream *inStream = (AVStream *) inVideoStream;
+        AVPacket *pkg = static_cast<AVPacket *>(packet);
+//            static int a = 0;
+//            pkg->dts = a++;
+//            pkg->pts = a;
+        pkg->pts -= firstKeyPts;
+        pkg->dts -= firstKeyDts;
+        pkg->pts = av_rescale_q_rnd(pkg->pts, inStream->time_base,
+                                    m_pOutVideo_stream->time_base,
+                                    (AVRounding) (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
+        pkg->dts = av_rescale_q_rnd(pkg->dts, inStream->time_base,
+                                    m_pOutVideo_stream->time_base,
+                                    (AVRounding) (AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
+        pkg->duration = av_rescale_q(pkg->duration, inStream->time_base,
+                                     m_pOutVideo_stream->time_base);
+        pkg->pos = -1;
+    }
+}
\ No newline at end of file
diff --git a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h
new file mode 100644
index 0000000..1f495fc
--- /dev/null
+++ b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h
@@ -0,0 +1,248 @@
+//
+// Created by ps on 19-1-11.
+//
+
+//
+// #TODO
+// 鍙互鎶奻fmpeg鐨勬搷浣滄娊鎴愪竴涓璞�
+//
+
+#ifndef GB28181SDK_FFMPEGDECODERJPG_H
+#define GB28181SDK_FFMPEGDECODERJPG_H
+
+#include <iostream>
+#include <unistd.h>
+#include <MyQueue.h>
+#include <Debug.h>
+#include <atomic>
+#include "GlobalSignalWaitLock.hpp"
+
+#include "opencv2/core.hpp"
+#include "opencv2/highgui.hpp"
+#include <list>
+#include "basic_struct_for_video_image.h"
+
+extern "C"
+{
+#include <libavutil/frame.h>
+#include <libavcodec/avcodec.h>
+#include <libavformat/avformat.h>
+#include <libswscale/swscale.h>
+#include <libavdevice/avdevice.h>
+#include <libavfilter/avfiltergraph.h>
+#include <libavfilter/buffersink.h>
+#include <libavfilter/buffersrc.h>
+#include <libavutil/avutil.h>
+#include <libavutil/imgutils.h>
+#include <libswscale/swscale.h>
+}
+
+#include <mutex>
+
+namespace BASICGB28181 {
+
+#define TryCath(CODE)     try { \
+CODE } catch (std::exception ex) { \
+ERR(ex.what()); \
+return false; \
+}
+
+    static void initFFmpeg();
+
+    static cv::Mat avframe_to_cvmat(AVFrame *frame);
+
+    typedef struct _buffInfo {
+        uint8_t *buff;
+        int buffLen;
+        std::string camIdx;
+    } frameBuffInfo;
+
+    struct FrameIdPackage_s_t {
+        int64_t m_frameId;
+        AVPacket m_packet;
+    };
+
+    struct FrameRange_s_t {
+        int64_t m_startFrameId;
+        int64_t m_endFrameId;
+        std::string m_videoName;
+
+        FrameRange_s_t() {
+            m_startFrameId = 0;
+            m_endFrameId = 0;
+            m_videoName.clear();
+        }
+
+        bool IsFrameIdInRange(int64_t frameId) {
+            return m_startFrameId <= frameId && frameId <= m_endFrameId;
+        }
+    };
+
+    enum RecordState_e_t {
+        START_RECORD,
+        RECORDING_VIDEO,
+        STOP_RECORD,
+    };
+//    std::map<std::string, MyQueue<frameBuffInfo *> > MapMyQueue;
+
+    static std::mutex g_mutex;
+
+    class FFmpegDecoderJPG {
+    public:
+        FFmpegDecoderJPG();
+
+        virtual ~FFmpegDecoderJPG();
+
+        /***
+         * 鏀惧叆I甯ф垨鑰匬甯�
+         * #TODO濡傛灉绗竴甯т笉鏄疘甯т細涓嶄細鏈夊紓甯革紵
+         * @param data 甯ф暟鎹湴鍧�
+         * @param datalen 鏁版嵁闀垮害
+         * @param camIdx 鎽勫儚鏈篿d
+         * @return
+         */
+        bool pushInfo(unsigned char *data, int datalen, const std::string &camIdx);
+
+        /***
+         * 寮�鍚В甯х嚎绋�
+         * @param camIdx 鎽勫儚鏈篿d
+         * @param gpuIdx gpuId
+         * @return
+         */
+        bool startThd(const std::string &camIdx, const int &fps, const int &gpuIdx = -1);
+
+        /***
+         * 鍋滄瑙e抚绾跨▼
+         * @return
+         */
+        bool stopThd();
+
+        //****************************
+        std::string GetImageName();
+
+        //淇濆瓨imageName鎵�鍦ㄧ殑瑙嗛鍒皊trPath鐨勮矾寰勪笅
+        bool SaveVideoByImageName(const std::string &strPath, const std::string &imageName);
+
+
+        //璁剧疆褰曞儚淇濆瓨鐨勬渶鐭暱搴﹀拰鏈�闀块暱搴�
+        bool SetMinMaxVideoSeconds(const int minSeconds, const int maxSecond);
+
+
+    private:
+        //妫�鏌ヤ繚瀛�,姣忔淇濆瓨涓�甯у埌鏁扮粍鐨勬椂鍊欒皟鐢�
+        bool CheckSave();
+
+        //Function
+        bool HandleSave();
+
+        //褰曞儚鐨勬椂鍊�,鍦ㄨ棰戜繚瀛樺畬浠ュ悗,璋冪敤杩欎釜鍑芥暟娓呯┖缂撳瓨
+        bool CleanToFrameId(int64_t lastFrameId);
+
+        //涓嶅綍鍍忕殑鏃跺��,濡傛灉淇濆瓨浜嗚冻澶熷鐨勫抚,璋冪敤姝ゅ嚱鏁版竻闄ゆ渶鍓嶉潰鐨勪袱涓狪甯т箣闂寸殑鏁版嵁
+        bool CleanOneKeyFrameOneRange();
+
+    private:
+        //璁板綍鏈�鍚庝竴涓狪甯х殑浣嶇疆
+        int64_t m_last_I_FrameId = -1;
+        //淇濆瓨瑙嗛鐨勮矾寰�
+        std::string m_videoPath;
+        //褰曞儚鐨勪袱绉嶇姸鎬侊紝
+        RecordState_e_t m_recordState = STOP_RECORD;
+
+        //寮�濮嬪綍鍍忕殑甯D
+        int64_t m_startFrameId = 0;
+
+        //鏈�鍚庝竴涓渶瑕佸綍鍍忕殑甯D
+        int64_t m_endFrameId = 0;
+
+        //Variable
+        // 褰曞儚瑙嗛鐨勬渶鐭暱搴�(甯ф暟)
+        int m_minVideoFrameCount = 10 * 25; // 10 seconds
+
+        //銆�褰曞儚瑙嗛鐨勬渶闀块暱搴�(甯ф暟)
+        int m_maxVideoFrameCount = 20 * 25; // 20 seconds;
+
+        int m_maxVectorFrameCount = m_maxVideoFrameCount * 2;
+
+        //瀵规敹鍒扮殑甯ц繘琛岃鏁�
+        int64_t m_frameIndex = 0;
+
+
+        //灏嗗抚淇濆瓨鍒板抚鏁扮粍
+        void SaveToPacketVector(AVPacket &packet);
+
+        //淇濆瓨lastFrameId涔嬪墠鐨勮棰戜繚瀛樺埌path琛ㄧず鐨勬枃浠朵腑
+        bool SaveVideo(std::string path, int64_t lastFrameId);
+
+
+    public:
+        //绗竴甯у繀椤绘槸I甯�
+        std::vector<FrameIdPackage_s_t> m_packetsVec;
+        //******************
+
+        int64_t frame_number, first_frame_number;
+
+        //鎵撳紑鏂囦欢鍐欏叆鏂囦欢澶�
+        int startWrite(const char *filename);
+
+        //鍏抽棴鐢╯tartWrite鎵撳紑鐨勬枃浠�
+        int stopWrite();
+
+        //瀵筽acket鍋氳浆鎹�
+        void conversion(void *packet, const long int &firstKeyPts, const long int &firstKeyDts, void *inVideoStream);
+
+        bool m_bstartWrite = {false};
+        bool m_bFirstKeyFrame = {false};
+        long int m_nFirstKeyPts = 0;
+        long int m_nFirstKeyDts = 0;
+        AVFormatContext *m_pOutFmtCtx = {nullptr};
+        AVStream *video_st{0};
+        AVStream *m_pOutVideo_stream{nullptr};
+
+        //****************************
+    public:
+        /***
+         * 鑾峰彇绾跨▼鐘舵��
+         * @return
+         */
+        bool getRunning();
+
+        cv::Mat getImage();
+
+//        #todo send Image func ? thd?
+
+    private:
+        int m_buf_size; //32768;
+        int m_gpuIdx;
+        int m_fps;
+        bool m_PackageState;
+        std::string m_camIdx;
+
+        MyQueue<frameBuffInfo *> m_rtpQueue;
+
+        cv::Mat m_image;
+
+        std::atomic<bool> m_running;
+        bool m_readData;
+    private:
+
+        /***
+         * ffmpeg璇诲彇鍐呭瓨鏁版嵁鍥炶皟鍑芥暟
+         * @param opaque
+         * @param buf
+         * @param bufsize
+         * @return
+         */
+        static int read_data(void *opaque, uint8_t *buf, int bufsize);
+
+        /***
+         * 瑁告祦瑙g爜鍑芥暟
+         * @param p_this 绫绘寚閽�
+         */
+        static void BareFlowDecoderThd(FFmpegDecoderJPG *p_this);
+
+    };
+}
+
+
+#endif //GB28181SDK_FFMPEGDECODERJPG_H
diff --git a/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.cpp b/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.cpp
new file mode 100644
index 0000000..88a8c6c
--- /dev/null
+++ b/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.cpp
@@ -0,0 +1,56 @@
+//
+// Created by ps on 19-3-1.
+//
+
+#include "GB28181Server.h"
+
+bool bGetLoaclRes = {false};
+
+GB28181Server::GB28181Server() {}
+
+GB28181Server::~GB28181Server() {
+    C_UnInitSDK();
+}
+
+void GB28181Server::setMysqlConnParam(const MysqlDBServerCfg &_MysqlConnParam) {
+    memset(&MysqlConnParam, 0, sizeof(MysqlConnParam_T));
+    strcpy(MysqlConnParam.Host, _MysqlConnParam.Host.c_str());    //杩炴帴鏁版嵁搴撶殑ip鍦板潃
+    MysqlConnParam.Port = _MysqlConnParam.Port;                        //杩炴帴鏁版嵁搴撶殑绔彛
+    strcpy(MysqlConnParam.UserName, _MysqlConnParam.UserName.c_str());        //杩炴帴鏁版嵁搴撶殑鐢ㄦ埛鍚�
+    strcpy(MysqlConnParam.Passwd, _MysqlConnParam.Passwd.c_str());        //杩炴帴鏁版嵁搴撶殑瀵嗙爜
+    strcpy(MysqlConnParam.DBName, _MysqlConnParam.DBName.c_str());    //杩炴帴鏁版嵁搴撶殑琛ㄥ悕
+    MysqlConnParam.DBConnCount = _MysqlConnParam.DBConnCount;                    //杩炴帴鏁版嵁搴撶殑鏁伴噺
+}
+
+void GB28181Server::setGBServerParam(const GBServerCfg &_GBServerParam) {
+    memset(&GBServerParam, 0, sizeof(GBServerParam_T));
+    strcpy(GBServerParam.SvrIp, _GBServerParam.SvrIp.c_str()); // 鍥芥爣鏈嶅姟鐨刬p鍦板潃  (鏈満鐨刬p鍦板潃)
+    //strcpy(GBServerParam.SvrNatIp, "222.35.102.22"); //娉ㄦ剰: 姝ゅ濡傛灉娌℃湁绌跨綉ip鍦板潃涓嶉渶瑕侀厤缃� (涓�鑸儴缃插叕缃戞椂浣跨敤)
+    GBServerParam.SvrPort = _GBServerParam.SvrPort; // 鍥芥爣鏈嶅姟鐩戝惉鐨勭鍙�
+    // 44122500042001000123
+    strcpy(GBServerParam.SvrPubID, _GBServerParam.SvrPubID.c_str()); // 鍥芥爣鏈嶅姟鍣ㄧ殑ID
+    GBServerParam.bMD5Auth = _GBServerParam.bMD5Auth;                            // 鏄惁闇�瑕丮D5鍔犲瘑
+    strcpy(GBServerParam.UserName, _GBServerParam.UserName.c_str()); // 鍥芥爣鏈嶅姟鐨勭敤鎴峰悕	(涓嬬骇璁惧娉ㄥ唽鐨勭敤鎴峰悕)
+    strcpy(GBServerParam.Passwd, _GBServerParam.Passwd.c_str());                // 鍥芥爣鏈嶅姟鐨勫瘑鐮�	(涓嬬骇璁惧娉ㄥ唽鐨勫瘑鐮�)
+    GBServerParam.SubScribeTime = _GBServerParam.SubScribeTime;  // 璁㈤槄鏃堕棿  濡傛灉涓�0 琛ㄧず涓嶈闃�
+}
+
+void GB28181Server::setUpperPlatform(const UpperPFCfg &_upperinfo) {
+    memset(&upperinfo, 0, sizeof(UpperPlatform_T));
+    strcpy(upperinfo.Name, _upperinfo.Name.c_str());
+    strcpy(upperinfo.PublicID, _upperinfo.PublicID.c_str());
+    strcpy(upperinfo.AuthUserName, _upperinfo.AuthUserName.c_str());
+    strcpy(upperinfo.AuthPasswd, _upperinfo.AuthPasswd.c_str());
+    strcpy(upperinfo.IpAddr, _upperinfo.IpAddr.c_str());
+    upperinfo.Port = _upperinfo.Port;
+    upperinfo.RegisterItv = _upperinfo.RegisterItv;
+    upperinfo.KeepAliveItv = _upperinfo.KeepAliveItv;
+}
+
+bool GB28181Server::initServer() {
+
+    bool iRet = C_InitSDK(&GBServerParam, &MysqlConnParam, NULL, enventcallback);
+    sleep(90);
+
+    return iRet;
+}
diff --git a/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.h b/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.h
new file mode 100644
index 0000000..ee5e6fd
--- /dev/null
+++ b/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.h
@@ -0,0 +1,93 @@
+//
+// Created by ps on 19-3-1.
+//
+
+#ifndef GB28181SDK_GB28181SERVER_H
+#define GB28181SDK_GB28181SERVER_H
+
+#include <iostream>
+#include <stdio.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <time.h>
+#include <string.h>
+#include "28181SDK.h"
+#include "SpinLock.hpp"
+
+struct MysqlDBServerCfg {
+    std::string Host; //杩炴帴鏁版嵁搴撶殑ip鍦板潃
+    int Port;//杩炴帴鏁版嵁搴撶殑绔彛
+    std::string UserName;//杩炴帴鏁版嵁搴撶殑鐢ㄦ埛鍚�
+    std::string Passwd;//杩炴帴鏁版嵁搴撶殑瀵嗙爜
+    std::string DBName;//杩炴帴鏁版嵁搴撶殑琛ㄥ悕
+    int DBConnCount;//杩炴帴鏁版嵁搴撶殑鏁伴噺
+};
+
+struct GBServerCfg {
+    std::string SvrIp;  // 鍥芥爣鏈嶅姟鐨刬p鍦板潃  (鏈満鐨刬p鍦板潃)
+    std::string SvrNatIp;       //娉ㄦ剰: 姝ゅ濡傛灉娌℃湁绌跨綉ip鍦板潃涓嶉渶瑕侀厤缃� (涓�鑸儴缃插叕缃戞椂浣跨敤)
+    int SvrPort;  // 鍥芥爣鏈嶅姟鐩戝惉鐨勭鍙�
+    std::string SvrPubID; // 鍥芥爣鏈嶅姟鍣ㄧ殑ID
+    bool bMD5Auth; // 鏄惁闇�瑕丮D5鍔犲瘑
+    std::string UserName;// 鍥芥爣鏈嶅姟鐨勭敤鎴峰悕	(涓嬬骇璁惧娉ㄥ唽鐨勭敤鎴峰悕)
+    std::string Passwd; // 鍥芥爣鏈嶅姟鐨勫瘑鐮�	(涓嬬骇璁惧娉ㄥ唽鐨勫瘑鐮�)
+    int SubScribeTime; // 璁㈤槄鏃堕棿  濡傛灉涓�0 琛ㄧず涓嶈闃�
+};
+
+struct UpperPFCfg {
+    std::string Name;
+    std::string PublicID;
+    std::string AuthUserName;
+    std::string AuthPasswd;
+    std::string IpAddr;
+    int Port;
+    int RegisterItv;
+    int KeepAliveItv;
+};
+
+class GB28181Server {
+public:
+    GB28181Server();
+
+    virtual ~GB28181Server();
+
+    void setMysqlConnParam(const MysqlDBServerCfg &_MysqlConnParam);
+
+    void setGBServerParam(const GBServerCfg &_GBServerParam);
+
+    void setUpperPlatform(const UpperPFCfg &_upperinfo);
+
+    bool initServer();
+
+private:
+    // mysql鏁版嵁搴撶殑閰嶇疆淇℃伅
+    MysqlConnParam_T MysqlConnParam;
+
+    //  鍥芥爣鏈嶅姟鐨勯厤缃俊鎭�
+    GBServerParam_T GBServerParam;
+
+    UpperPlatform_T upperinfo;
+
+    static bool bGetLoaclRes;
+
+private:
+    //鎵撳嵃浜嬩欢鍥炶皟淇℃伅
+    static void enventcallback(int eventtype, int eventparam, int datalen, char *data) {
+        printf("eventtype:%d, eventparam:%d, datalen:%d, data:%s\n", eventtype, eventparam, datalen, data);
+        if (eventtype == 2) {
+//            GB28181Server::bGetLoaclRes = true;
+        } else if (eventtype == 1 && eventparam == 1) {
+            C_GetResource(NULL);
+        }
+    }
+
+};
+
+
+#endif //GB28181SDK_GB28181SERVER_H
diff --git a/QiaoJiaSystem/GB28181DecoderModel/GlobalSignalWaitLock.hpp b/QiaoJiaSystem/GB28181DecoderModel/GlobalSignalWaitLock.hpp
new file mode 100644
index 0000000..83b1365
--- /dev/null
+++ b/QiaoJiaSystem/GB28181DecoderModel/GlobalSignalWaitLock.hpp
@@ -0,0 +1,115 @@
+//
+// Created by pans on 19-1-13.
+//
+
+#ifndef GB28181SDK_GLOBALSIGNALWAITLOCK_H
+#define GB28181SDK_GLOBALSIGNALWAITLOCK_H
+
+#include <iostream>
+#include <basic/util/thread/RWLock.hpp>
+
+//#define TryCath(CODE)     try { \
+//CODE } catch (std::exception ex) { \
+//ERR(ex.what()); \
+//return false; \
+//} return true;
+
+#define gSignalLock GlobalSignalWaitLock::getInstance()
+
+//#todo 璁板綍姣忎釜淇″彿鐨剋ait鐘舵�侊紝閬垮厤鏌愪釜淇″彿杩樺湪浣跨敤鍗村皢鍏跺垹闄ょ殑鎯呭喌
+class SignalLock {
+public:
+    SignalLock() : m_signal_cond_mutex(PTHREAD_MUTEX_INITIALIZER),
+                   m_signal_cond(PTHREAD_COND_INITIALIZER) {
+
+    }
+
+    virtual ~SignalLock() {
+
+    }
+
+    bool wait() {
+        pthread_mutex_lock(&m_signal_cond_mutex);
+        pthread_cond_wait(&m_signal_cond, &m_signal_cond_mutex);
+        pthread_mutex_unlock(&m_signal_cond_mutex);
+    }
+
+    bool emit() {
+        pthread_cond_signal(&m_signal_cond);
+    }
+
+
+private:
+
+    pthread_cond_t m_signal_cond;
+    pthread_mutex_t m_signal_cond_mutex;
+
+};
+
+class GlobalSignalWaitLock {
+
+public:
+//    浠呮敮鎸佷竴瀵逛竴锛�#TODO澶氬涓�
+    static GlobalSignalWaitLock &getInstance() {
+        static GlobalSignalWaitLock globalSignalWaitLock;
+        return globalSignalWaitLock;
+    }
+
+protected:
+    GlobalSignalWaitLock() : m_live(true) {}
+
+    virtual ~GlobalSignalWaitLock() {
+        m_slRwLock.wrlock();
+        m_signalLock.clear();
+        m_slRwLock.unlock();
+
+    }
+
+private:
+    bool m_live;
+    RWLock m_slRwLock;
+    std::map<std::string, SignalLock> m_signalLock;
+
+public:
+    bool waitSignal(std::string key) {
+        try {
+            m_slRwLock.rdlock();
+            if (m_signalLock.find(key) == m_signalLock.end()) {
+                m_slRwLock.r2wLock();
+                m_signalLock[key] = std::move(SignalLock());
+                m_slRwLock.w2rLock();
+            }
+            SignalLock &t_signalLock = m_signalLock[key];
+            m_slRwLock.unlock();
+            t_signalLock.wait();
+        } catch (std::exception ex) {
+            ERR(ex.what());
+            m_slRwLock.unlock();
+            return false;
+        }
+        return true;
+    }
+
+    bool emitSigal(std::string key) {
+        try {
+            m_slRwLock.rdlock();
+            if (m_signalLock.find(key) == m_signalLock.end()) {
+                m_slRwLock.r2wLock();
+                m_signalLock[key] = std::move(SignalLock());
+                m_slRwLock.w2rLock();
+            }
+            SignalLock &t_signalLock = m_signalLock[key];
+            m_slRwLock.unlock();
+            t_signalLock.emit();
+        } catch (std::exception ex) {
+            ERR(ex.what());
+            m_slRwLock.unlock();
+            return false;
+        }
+        return true;
+
+    }
+};
+
+
+#endif //GB28181SDK_GLOBALSIGNALWAITLOCK_H
diff --git a/QiaoJiaSystem/GB28181DecoderModel/SpinLock.hpp b/QiaoJiaSystem/GB28181DecoderModel/SpinLock.hpp
new file mode 100644
index 0000000..e6e74f8
--- /dev/null
+++ b/QiaoJiaSystem/GB28181DecoderModel/SpinLock.hpp
@@ -0,0 +1,30 @@
+//
+// Created by ps on 19-3-1.
+//
+
+#ifndef GB28181SDK_SPINLOCK_H
+#define GB28181SDK_SPINLOCK_H
+
+#include <atomic>
+
+class SpinLock {
+public:
+    SpinLock() : m_lock(ATOMIC_FLAG_INIT) {}
+
+    virtual ~SpinLock() {
+
+    }
+
+    void lock() {
+        while (m_lock.test_and_set());
+    }
+
+    void unlock() {
+        m_lock.clear();
+    }
+
+private:
+    std::atomic_flag m_lock;
+};
+
+#endif //GB28181SDK_SPINLOCK_H
diff --git a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
new file mode 100644
index 0000000..77862e7
--- /dev/null
+++ b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
@@ -0,0 +1,210 @@
+//
+// Created by ps on 19-1-10.
+//
+
+#include <opencv2/imgproc.hpp>
+#include <qt5/QtCore/QDateTime>
+#include <basic/util/app/AppPreference.hpp>
+#include "VideoCaptureElementWithRtp.h"
+
+//std::string BASICGB28181::VideoCaptureElementWithRtp::m_chanPubID;
+//BASICGB28181::FFmpegDecoderJPG BASICGB28181::VideoCaptureElementWithRtp::m_fFmpegDecoderJPG;
+
+BASICGB28181::VideoCaptureElementWithRtp::VideoCaptureElementWithRtp(std::string &chanPubID, int fps,
+                                                                     int streamTransType,
+                                                                     int gpuIdx) : m_chanPubID(chanPubID), m_fps(fps),
+                                                                                   m_running(false),
+                                                                                   m_waitSignal(false),
+                                                                                   m_streamTransType(streamTransType),
+                                                                                   m_gpuIdx(gpuIdx),
+                                                                                   m_userdata((long) this) {
+//    m_chanPubID = chanPubID;
+
+    m_cutPath = appPref.getStringData("user.loop.absolute.path");
+
+    assert(!m_cutPath.empty());
+}
+
+BASICGB28181::VideoCaptureElementWithRtp::~VideoCaptureElementWithRtp() {
+    m_fFmpegDecoderJPG.stopThd();
+    int loop = 0;
+    while ((loop++ < 100) && m_fFmpegDecoderJPG.getRunning()) {
+        m_fFmpegDecoderJPG.stopThd();
+        usleep(100000);
+    }
+}
+
+bool BASICGB28181::VideoCaptureElementWithRtp::startRtpStream(int streamTransType) {
+
+    TryCath(
+    //--------------鍥芥爣璁惧鎴栧垯鍥芥爣涓嬬骇骞冲彴蹇呴』鏀寔GB28181-2016----------------------------------------------
+        std::thread videoCaptureElementThd([&](VideoCaptureElementWithRtp *p_this, int streamType) {
+            DBG("videoCaptureElementThd start...");
+            StreamTransType_E etype;
+            switch (streamType) {
+                case 1: {
+                    // 1.瀹炴椂瑙嗛璇锋眰 UDP璇锋眰瀹炴椂瑙嗛
+                    etype = E_STREAM_TRANS_UDP;
+                    break;
+                }
+                case 2: {
+                    // 2.瀹炴椂瑙嗛璇锋眰 TCP涓诲姩璇锋眰瀹炴椂瑙嗛
+                    etype = E_STREAM_TRANS_TCPACTIVE;
+                    break;
+                }
+                case 3: {
+                    // 3.瀹炴椂瑙嗛璇锋眰 TCP琚姩璇锋眰瀹炴椂瑙嗛
+                    etype = E_STREAM_TRANS_TCPPASSIVE;
+                    break;
+                }
+                default:
+                    etype = E_STREAM_TRANS_UDP;
+            }
+            DBG("C_RealVideoStart start... m_chanPubID is " << p_this->m_chanPubID << " etype is " << etype
+                                                            << " m_userdata is " << m_userdata);
+            long lrealhandle = C_RealVideoStart(const_cast<char *>(p_this->m_chanPubID.c_str()), etype,
+                                                p_this->streamcallback, m_userdata);
+
+            if (lrealhandle != -1) {
+                DBG(p_this->m_chanPubID << "  C_RealVideoStart ok ... type is " << etype);
+                p_this->m_running = true;
+                p_this->m_fFmpegDecoderJPG.startThd(p_this->m_chanPubID, p_this->m_fps, p_this->m_gpuIdx);
+                while (p_this->m_running) {
+                    usleep(300000);
+                }
+                DBG("videoCaptureElementThd stop ...");
+                C_RealVideoStop(lrealhandle);
+                DBG("videoCaptureElementThd stop ok...");
+            } else {
+                p_this->m_running = false;
+                p_this->m_fFmpegDecoderJPG.stopThd();
+                ERR(p_this->m_chanPubID << " C_RealVideoStart is error lrealhandle is  " << lrealhandle);
+            }
+
+        }, this, streamTransType);
+        videoCaptureElementThd.detach();
+    );
+
+    return true;
+}
+
+bool BASICGB28181::VideoCaptureElementWithRtp::stopRtpStream() {
+    TryCath(
+        m_running = false;
+    );
+    return true;
+}
+
+bool BASICGB28181::VideoCaptureElementWithRtp::getRunning() {
+    return m_running;
+}
+
+void BASICGB28181::VideoCaptureElementWithRtp::streamcallback(long handle, int datatype, int frametype,
+                                                              unsigned char *data, int datalen, long userdata) {
+#ifdef TestCode
+    ClockTimer test("streamcallback");
+#endif
+
+    BASICGB28181::VideoCaptureElementWithRtp *p_this = (BASICGB28181::VideoCaptureElementWithRtp *) userdata;
+
+#ifdef TestCode
+    {
+//        FILE *fp11 = NULL;
+//        if (!fp11) {
+////            printf("fp11 handle:%ld, datatype:%d, datalen:%d, userdata:%ld\n", handle, datatype, datalen, userdata);
+//            std::string fileName(p_this->m_chanPubID);
+//            fileName.append(".mp4");
+//            fp11 = fopen(fileName.c_str(), "w+");
+//        }
+//        fwrite(data, sizeof(char), datalen, fp11);
+    }
+#endif
+
+    CHKDBG(p_this->m_fFmpegDecoderJPG.pushInfo(data, datalen, p_this->m_chanPubID), true,
+           "pushInfo is error !! handle is " << handle << " datatype is " << datatype << " frametype is " << frametype);
+}
+
+void BASICGB28181::VideoCaptureElementWithRtp::threadFunc() {
+    fireConnectors();
+}
+
+void BASICGB28181::VideoCaptureElementWithRtp::threadInitial() {
+
+    std::thread waitSignalAndEmit([&](BASICGB28181::VideoCaptureElementWithRtp *p_this) {
+        p_this->m_waitSignal = true;
+        while (p_this->m_waitSignal) {
+//#TODO wait test
+#ifdef TestCode
+            DBG("waitSignal(\"DecoderImageOK\") begin");
+#endif
+            gSignalLock.waitSignal(p_this->m_chanPubID + "DecoderImageOK");
+#ifdef TestCode
+            DBG("waitSignal(\"DecoderImageOK\") after");
+#endif
+            p_this->m_picCount++;
+            //鍑犲紶閫変竴寮犳斁鍏edis
+            if (p_this->m_picCount % m_nPicsPickOne != 0) {
+                continue;
+            } else {
+                p_this->m_picCount.store(0);
+            }
+
+            p_this->m_fFmpegDecoderJPG.getImage().copyTo(p_this->m_image);
+            {
+                cv::Mat copyMat;
+                std::string imageName = p_this->m_fFmpegDecoderJPG.GetImageName();
+                p_this->m_image.copyTo(copyMat);
+//                m_pManager->SaveImageToRedis(m_camId, imageName, copyMat);
+            }
+            p_this->submit();
+        }
+        INFO("waitSignalAndEmit is exit...");
+    }, this);
+    waitSignalAndEmit.detach();
+    startRtpStream(m_streamTransType);
+}
+
+void BASICGB28181::VideoCaptureElementWithRtp::threadClosing() {
+    m_waitSignal = false;
+    stopRtpStream();
+}
+
+cv::Mat BASICGB28181::VideoCaptureElementWithRtp::getImage() {
+    return m_image;
+}
+
+void BASICGB28181::VideoCaptureElementWithRtp::SetVideoMinMaxSeconds(const int minSeconds, const int maxSeconds) {
+
+    m_fFmpegDecoderJPG.SetMinMaxVideoSeconds(minSeconds, maxSeconds);
+}
+
+void BASICGB28181::VideoCaptureElementWithRtp::SaveVideo(const std::string &strImageName) {
+
+    INFO("SaveVideo: " << strImageName);
+    std::string strTimeStamp = AppUtil::getTimeUSecString();
+    std::string strPath = MakeDir(strTimeStamp);
+    m_fFmpegDecoderJPG.SaveVideoByImageName(strPath, strImageName);
+}
+
+std::string BASICGB28181::VideoCaptureElementWithRtp::MakeDir(const std::string &timeStamp) {
+
+    std::string t_FilePath = m_cutPath;
+
+    if (t_FilePath.back() != '/') {
+        t_FilePath.push_back('/');
+    }
+    char buf[24];
+    QDateTime dt = QDateTime::fromString(QString::fromStdString(timeStamp), "yyyy-MM-dd hh:mm:ss:zzz");
+
+    std::string t_strTime = dt.toString("yyyyMMddhh").toStdString();
+    // DBG("t_strTime="<<t_strTime);
+    t_FilePath.append(m_chanPubID + "/" + t_strTime.substr(0, 6) + "/" + t_strTime.substr(6, 2) + "/");
+    //YYYYMMDDHH
+    t_FilePath.append(t_strTime.substr(0, 10) + "/");
+    std::string t_cmd = "mkdir -p '";
+    t_cmd.append(t_FilePath + "'");
+    //#get path mkdir path
+    system(t_cmd.c_str());
+
+    return t_FilePath;
+}
diff --git a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
new file mode 100644
index 0000000..a4fa33b
--- /dev/null
+++ b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
@@ -0,0 +1,94 @@
+//
+// Created by ps on 19-1-10.
+//
+
+#ifndef GB28181SDK_VIDEOCAPTUREELEMENT_H
+#define GB28181SDK_VIDEOCAPTUREELEMENT_H
+
+#include "FFmpegDecoderJPG.h"
+#include "28181SDK.h"
+#include <basic/pipe/PipeElement.h>
+#include "GlobalSignalWaitLock.hpp"
+
+namespace BASICGB28181 {
+
+    class VideoCaptureElementWithRtp : public basic::PipeElement {
+    public:
+        explicit VideoCaptureElementWithRtp(std::string &chanPubID, int fps, int streamTransType, int gpuIdx = -1);
+
+        virtual ~VideoCaptureElementWithRtp();
+
+
+        /***
+         * 鑾峰彇褰撳墠瀹炴椂娴佹帴鏀舵暟鎹嚎绋嬭繍琛岀姸鎬�
+         * @return
+         */
+        bool getRunning();
+
+        cv::Mat getImage();
+
+        //淇濆瓨瑙嗛鎺ュ彛,浠嶳tspAnalysManager鍙戣捣璋冪敤
+        void SaveVideo(const std::string &strImageName);
+
+        //璁剧疆淇濆瓨瑙嗛鐨勬渶灏忓拰鏈�澶ч暱搴�,鍗曚綅鏄,瀹為檯鐨勮繍琛屾儏鍐垫湁涓�浜涘樊璺濓紝闇�瑕佸畬鍠�
+        void SetVideoMinMaxSeconds(const int minSeconds, const int maxSeconds);
+
+        //鏍规嵁timeStamp鍒涘缓璺緞
+        std::string MakeDir(const std::string &timeStamp);
+
+    private:
+        int m_gpuIdx;
+        int m_fps;
+        int m_streamTransType;
+        std::string m_chanPubID;
+        std::atomic<int> m_picCount{0};
+        //鍑犲紶鍥句涪涓�寮�,鐩墠鏄�8寮犱涪涓�寮�
+        const int m_nPicsPickOne = 8;
+        FFmpegDecoderJPG m_fFmpegDecoderJPG;
+        cv::Mat m_image;
+        long m_userdata;
+
+        std::atomic<bool> m_running;
+        std::atomic<bool> m_waitSignal;
+
+        //鐢ㄦ潵淇濆瓨褰曞儚瑙嗛鐨勮矾寰�
+        std::string m_cutPath;
+    private:
+        /***
+         * 鍚姩瀹炴椂娴佹帴鏀舵暟鎹嚎绋�
+         * @param streamTransType 娴佹暟鎹彂閫佹柟寮�
+         * @return
+         */
+        bool startRtpStream(int streamTransType = 1);
+
+        /***
+         * 鍋滄瀹炴椂娴佹帴鏀舵暟鎹嚎绋�
+         * @return
+         */
+        bool stopRtpStream();
+
+
+        /***
+         * rtp缁勫寘鍥炶皟鍑芥暟
+         * @param handle
+         * @param datatype
+         * @param frametype
+         * @param data
+         * @param datalen
+         * @param userdata
+         */
+        static void streamcallback(long handle, int datatype, int frametype,
+                                   unsigned char *data, int datalen, long userdata);
+
+        virtual void threadFunc() override;
+
+        virtual void threadInitial() override;
+
+        virtual void threadClosing() override;
+
+    };
+
+}
+
+
+#endif //GB28181SDK_VIDEOCAPTUREELEMENT_H
diff --git a/QiaoJiaSystem/GB28181DecoderModel/main.cpp b/QiaoJiaSystem/GB28181DecoderModel/main.cpp
new file mode 100644
index 0000000..12ed27d
--- /dev/null
+++ b/QiaoJiaSystem/GB28181DecoderModel/main.cpp
@@ -0,0 +1,123 @@
+//
+// Created by ps on 19-1-8.
+//
+
+#include <iostream>
+#include <thread>
+#include <Debug.h>
+
+#include "GB28181Server.h"
+#include "VideoCaptureElementWithRtp.h"
+
+#include <opencv2/opencv.hpp>
+#include <CvUtil.h>
+
+using namespace std;
+
+
+int main(int argc, char **argv) {
+    std::cout << "test " << std::endl;
+
+    bool running = true;
+    bool serinit = false;
+
+    MysqlDBServerCfg mysqlDBServerCfg;
+    mysqlDBServerCfg.Host = "192.168.1.148";
+    mysqlDBServerCfg.Port = 3306;
+    mysqlDBServerCfg.UserName = "root";
+    mysqlDBServerCfg.Passwd = "123456";
+    mysqlDBServerCfg.DBName = "EGEyesForVSS";
+    mysqlDBServerCfg.DBConnCount = 5;
+
+    GBServerCfg gbServerCfg;
+    gbServerCfg.SvrIp = "192.168.1.148"; // 鍥芥爣鏈嶅姟鐨刬p鍦板潃  (鏈満鐨刬p鍦板潃)
+    gbServerCfg.SvrPort = 7060; // 鍥芥爣鏈嶅姟鐩戝惉鐨勭鍙�
+    gbServerCfg.SvrPubID = "44120000002000000001"; // 鍥芥爣鏈嶅姟鍣ㄧ殑ID
+    gbServerCfg.bMD5Auth = false; // 鏄惁闇�瑕丮D5鍔犲瘑
+    gbServerCfg.UserName = "44120100002000000002"; // 鍥芥爣鏈嶅姟鐨勭敤鎴峰悕	(涓嬬骇璁惧娉ㄥ唽鐨勭敤鎴峰悕)
+    gbServerCfg.Passwd = "123456"; // 鍥芥爣鏈嶅姟鐨勫瘑鐮�	(涓嬬骇璁惧娉ㄥ唽鐨勫瘑鐮�)
+    gbServerCfg.SubScribeTime = 3600; // 璁㈤槄鏃堕棿  濡傛灉涓�0 琛ㄧず涓嶈闃�
+
+    SpinLock spinLock;
+
+    auto func = [&] {
+        spinLock.lock();
+        GB28181Server m_gbs;
+        m_gbs.setMysqlConnParam(mysqlDBServerCfg);
+        m_gbs.setGBServerParam(gbServerCfg);
+        DBG("initServer start before");
+        serinit = m_gbs.initServer();
+        DBG("initServer start after");
+
+        spinLock.unlock();
+        while (running) {
+            usleep(4000);
+        }
+
+    };
+
+    std::thread thd(func);
+
+    //      ---------------------娴嬭瘯------------------------
+    spinLock.lock();
+    DBG("test start");
+    //#todo search from db
+    char ChanPubID2[] = "11010202081314000001";
+    std::string str_ChanPubID2(ChanPubID2);
+    BASICGB28181::VideoCaptureElementWithRtp videoCapture2(str_ChanPubID2, 25, 1, 0);
+    videoCapture2.registerConnector([&]() {
+        {
+            //testCode
+            cv::Mat t_image = videoCapture2.getImage();
+            if (t_image.empty()) {
+                ERR("t_image is empty");
+                return;
+            }
+            std::string strNewTime;
+            strNewTime = AppUtil::getTimeUSecString();
+            cv::putText(t_image, strNewTime, cv::Point(408, 540), cv::HersheyFonts::FONT_HERSHEY_PLAIN, 5,
+                        cv::Scalar(255, 255, 0), 2);
+            DBG("imshow image" << str_ChanPubID2 << strNewTime);
+//            imshow("str_ChanPubID2", t_image);
+//            cv::waitKey(10);
+
+
+
+#if 1
+            {
+//            TestCode
+//                ClockTimer cl("str_ChanPubID1");
+                std::string strNewTime2 = AppUtil::getTimeUSecString();
+//                cv::putText(t_image, strNewTime2, cv::Point(408, 540), cv::HersheyFonts::FONT_HERSHEY_PLAIN,
+//                            5, cv::Scalar(255, 255, 0), 2);
+                std::thread test([&](cv::Mat img, std::string strThing) {
+                    try {
+                        std::string strNewTime = "tmpDec/";
+                        strNewTime.append(str_ChanPubID2 + "_").append(strThing).append(".jpg");
+                        cv::imwrite(strNewTime, img);
+                    } catch (std::exception ex) {
+                        ERR(ex.what());
+                    }
+                }, t_image, strNewTime2);
+                test.detach();
+            }
+#endif
+
+
+        }
+    });
+
+    usleep(10);
+    videoCapture2.start();
+    sleep(60);
+    videoCapture2.stop();
+    DBG("test end");
+
+    getchar();
+
+    running = false;
+
+    getchar();
+    sleep(2);
+    return 0;
+}
\ No newline at end of file
diff --git a/QiaoJiaSystem/LocalDBTool/SqliteFaceEncap.cpp b/QiaoJiaSystem/LocalDBTool/SqliteFaceEncap.cpp
index 2ae3d1e..8d2b1c7 100644
--- a/QiaoJiaSystem/LocalDBTool/SqliteFaceEncap.cpp
+++ b/QiaoJiaSystem/LocalDBTool/SqliteFaceEncap.cpp
@@ -179,6 +179,9 @@
         if (faceData.faceUrl.size() > 0) {
             strSql.append(" faceUrl =  :faceUrl ,");
         }
+//        if (faceData.enabled.size() > 0) {
+//            strSql.append(" enabled =  :enabled ,");
+//        }
 
         //#todo
         strSql.append(" update_time = '2010-01-03 01:01:00' ");
@@ -192,6 +195,9 @@
         if (faceData.faceUrl.size() > 0) {
             query.addBindValue(QString::fromStdString(faceData.faceUrl));
         }
+//        if (faceData.enabled.size() > 0) {
+//            query.addBindValue(QString::fromStdString(faceData.enabled));
+//        }
 
         if (!query.exec()) {
             ERR("updateFaceData fail");
@@ -370,6 +376,11 @@
             tableInfo.bwType = query.value(3).toString().toStdString();
             tableInfo.startTime = query.value(4).toString().toStdString();
             tableInfo.endTime = query.value(5).toString().toStdString();
+            tableInfo.uploadFlag = query.value(6).toString().toStdString();
+            tableInfo.cmpThreshold = query.value(7).toString().toStdString();
+            tableInfo.enabled = query.value(8).toString().toStdString();
+            tableInfo.createBy = query.value(9).toString().toStdString();
+
             tableInfos.push_back(tableInfo);
         }
     }
@@ -397,6 +408,8 @@
             tableInfo.sex = query.value(3).toString().toStdString();
             tableInfo.idCard = query.value(4).toString().toStdString();
             tableInfo.phoneNum = query.value(5).toString().toStdString();
+            tableInfo.enable = query.value(10).toString().toStdString();
+            tableInfo.monLevel = query.value(11).toString().toStdString();
             faceInfosCache.insert(std::make_pair(tableInfo.uuid, tableInfo));
         }
     }
diff --git a/QiaoJiaSystem/LocalDBTool/SqliteFaceEncap.h b/QiaoJiaSystem/LocalDBTool/SqliteFaceEncap.h
index 7928ddf..85d834e 100644
--- a/QiaoJiaSystem/LocalDBTool/SqliteFaceEncap.h
+++ b/QiaoJiaSystem/LocalDBTool/SqliteFaceEncap.h
@@ -12,15 +12,35 @@
 /**
  * #todo sqlite -> Qt.sqlite
  */
-
+/***
+ * sqlite3 鎿嶄綔宸ュ叿绫�
+ */
 class SqliteFaceEncap : public sqliteEncapsulation {
 public:
     explicit SqliteFaceEncap(std::string t_string);
 
+    /***
+     * 鍒涘缓甯冩帶搴曞簱
+     * 涓嶉�氱敤锛屽洜涓哄唴閮ㄦ湁涓�涓猧nsert鍑芥暟璋冪敤
+     * @param t_tableName
+     * @param fieldValues
+     * @return
+     */
     bool createTable(std::string t_tableName, FieldValues &fieldValues);
 
+    /***
+     * 閫氱敤鐨勫崟琛ㄦ洿鏂�
+     * @param t_tableName
+     * @param fieldValues
+     * @return
+     */
     bool updateTable(std::string t_tableName, FieldValues &fieldValues);
 
+    /***
+     * 鍒犻櫎琛�
+     * @param t_tableName
+     * @return
+     */
     bool deleteTable(std::string t_tableName);
 
     /***
@@ -30,26 +50,80 @@
      */
     std::vector<std::string> getTableNameList(std::string type);
 
+    /***
+     * 鑾峰彇鎵�鏈夊凡鍒涘缓鐨勮〃淇℃伅
+     * @return
+     */
     TableInfos getTableInfos();
 
 public:
 
+    /***
+     * 娣诲姞浜鸿劯
+     * @param t_tableName 琛ㄥ悕
+     * @param faceData 浜鸿劯鐗瑰緛缁撴瀯浣�
+     * @param fieldValues 瀛楁闆嗗悎
+     * @return
+     */
     std::string addFace(std::string t_tableName, AddFaceData &faceData, FieldValues &fieldValues);
 
+    /***
+     * 鏇存柊浜鸿劯
+     * @param t_tableName 琛ㄥ悕
+     * @param faceData 浜鸿劯鐗瑰緛缁撴瀯浣�
+     * @param fieldValues 瀛楁闆嗗悎
+     * @return
+     */
     bool updateFace(std::string t_tableName, AddFaceData &faceData, FieldValues &fieldValues);
 
+    /***
+     * 鍚戜汉鑴哥壒寰佽〃鎻掑叆璁板綍
+     * @param t_tableName
+     * @param faceData
+     * @return
+     */
     std::string addFaceData(std::string t_tableName, AddFaceData &faceData);
 
     //#todo
+    /***
+     * 娣诲姞浜鸿劯涓氬姟淇℃伅
+     * @param t_tableName
+     * @param fieldValues
+     * @return
+     */
     bool addFaceInfo(std::string t_tableName, FieldValues &fieldValues);
 
+    /***
+     *
+     * @param t_tableName
+     * @param faceData
+     * @return
+     */
     bool updateFaceData(std::string t_tableName, AddFaceData &faceData);
 
+    /***
+     *
+     * @param t_tableName
+     * @param fieldValues
+     * @return
+     */
     bool updateFaceInfo(std::string t_tableName, FieldValues &fieldValues);
 
+    /***
+     *
+     * @param t_tableName
+     * @param uuid
+     * @return
+     */
     bool deleteFace(std::string t_tableName, std::string uuid);
 
 private:
+    /***
+     *
+     * @param t_tableName
+     * @param uuid
+     * @return
+     */
     bool deleteFaceData(std::string t_tableName, std::string uuid);
 
 public:
diff --git a/QiaoJiaSystem/LocalDBTool/SqliteToolkit.hpp b/QiaoJiaSystem/LocalDBTool/SqliteToolkit.hpp
index 06dfd59..ff1bb42 100644
--- a/QiaoJiaSystem/LocalDBTool/SqliteToolkit.hpp
+++ b/QiaoJiaSystem/LocalDBTool/SqliteToolkit.hpp
@@ -1,6 +1,10 @@
 //
 // Created by pans on 4/28/18.
 //
+/***
+ * 璇存槑锛屾湰鏂囦欢涓昏鏄痵ql璇彞鎷兼帴鍙婅幏鍙栧凡瀹氫箟鐨剆ql璇彞
+ * 鐩墠浠呮敮鎸佸崟琛╯ql璇彞鎷兼帴
+ */
 
 #ifndef TESTSQLITE_SQLITETOOLKIT_HPP
 #define TESTSQLITE_SQLITETOOLKIT_HPP
@@ -24,12 +28,19 @@
  */
 typedef std::vector<unsigned char> FaceFeature;
 
+/***
+ * 娣诲姞浜鸿劯鐨勬暟鎹粨鏋�
+ */
 struct AddFaceData {
     std::string uuid;
     FaceFeature feature;
     std::string faceUrl;
+    std::string feature_base64;
 };
 
+/***
+ * 浜鸿劯淇℃伅鐨勬暟鎹粨鏋�
+ */
 struct FaceInfo {
     std::string uuid;
     std::string personName;
@@ -37,10 +48,15 @@
     std::string sex;
     std::string idCard;
     std::string phoneNum;
+    std::string enable;
+    std::string monLevel;
 };
 typedef std::vector<FaceInfo> FaceInfos;
 typedef std::map<std::string, FaceInfo> FaceInfosCache;
 
+/***
+ * 琛ㄤ俊鎭暟鎹粨鏋�
+ */
 struct TableInfo {
     std::string uuid;
     std::string tableName;
@@ -49,6 +65,10 @@
     std::string startTime;
     std::string endTime;
     std::string createBy;
+
+    std::string uploadFlag;
+    std::string cmpThreshold;
+    std::string enabled;
 };
 typedef std::vector<TableInfo> TableInfos;
 typedef std::map<std::string, TableInfo> TableInfosCache;
@@ -57,10 +77,15 @@
 
 //typedef std::map<std::string, FaceFeatures> FeatureDBCache;
 
+/***
+ * 甯︽湁URL鍜屽叾浠栧睘鎬х殑浜鸿劯鐗瑰緛鏁版嵁缁撴瀯
+ */
 struct FaceFeatureWithUrl {
     std::string uuid;
     std::string faceurl;
     FaceFeature faceFeature;
+    std::string enable;
+    std::string monLevel;
 };
 
 typedef std::map<std::string, FaceFeatureWithUrl> FeatureDBWithUrlCache;
@@ -72,39 +97,59 @@
 #define SQLERR(message) fprintf(stderr, "%s->%d->  SQLite error: %s\n",__FILE__,__LINE__, message);
 
 
-    //#todo 鏁版嵁搴搘enjian鍚嶇О
+    //#todo 鏁版嵁搴撴枃浠跺悕绉�
+    //鏄惁闇�瑕佷粠閰嶇疆鏂囦欢璇诲彇锛�
     static std::string file_dbName = "TestFaceDB.db";
     //#todo 鏁版嵁搴撳悕绉�
     static std::string g_dbName = "main";
     //#todo 绠$悊琛ㄧ殑琛ㄥ悕
     static std::string g_tableName = "sys_o_tables";
 
-    //
+    /***
+     * 鑾峰彇浜鸿劯鐗瑰緛鏌ヨ鐨剆qlite璇彞
+     * @param tableName 琛ㄥ悕锛屼笉甯� _fea
+     * @return
+     */
     std::string getFacesFromTableSql(std::string tableName) {
+//        #todo get monLevel 鑱斿悎鏌ヨ
         std::string sql =
-            "select uuid,feature,create_time,faceUrl,del_flag from " + tableName +
-            "_fea where feature is not null ";
+            "select uuid,feature,create_time,faceUrl,del_flag from '" + tableName +
+            "_fea' where feature is not null ";
         return sql;
     }
 
+    /***
+     * 鏍规嵁琛ㄧ被鍨嬭幏鍙栨暟鎹〃鍒楄〃
+     * @param type
+     * @return
+     */
     std::string getTableListSqlWithType(std::string type) {
-        std::string sql = "select tableName,del_flag from " + g_tableName + " where del_flag = 0";
+        std::string sql = "select tableName,del_flag from '" + g_tableName + "' where del_flag = 0";
         if (type.size() > 0) {
             sql.append(" and tableType = '" + type + "'");
         }
         return sql;
     }
 
+    /***
+     * 鏌ヨ浠绘剰琛ㄧ殑鎵�鏈夊瓧娈�
+     * @param tableName
+     * @return
+     */
     std::string getTableInfosSql(std::string tableName) {
-        std::string sql = "select * from " + tableName;// + " where del_flag = 0";
+        std::string sql = "select * from '" + tableName + "';";// + " where del_flag = 0";
         return sql;
     }
 
-
+    /***
+     * 鑾峰彇褰撳墠宸插垱寤虹殑琛�
+     * @return
+     */
     std::string getTableInfosSql() {
         //uuid,tableName,tableDesc,tableType,bwType,startTime,endTime
-        std::string sql = "select uuid,tableName,tableType,bwType,startTime,endTime from " + g_tableName +
-                          " where del_flag = 0";
+        std::string sql =
+            "select uuid,tableName,tableType,bwType,startTime,endTime,uploadFlag,cmpThreshold,enabled,create_by from " +
+            g_tableName + " where del_flag = 0";
         return sql;
     }
 
@@ -124,7 +169,7 @@
         str_fea.assign(feature.begin(), feature.end());
 
         std::stringstream sql;//= ;
-        sql << "INSERT INTO " << tableName << " (";
+        sql << "INSERT INTO '" << tableName << "' (";
         //std::string sqlTemp = sql;
         std::string sql2 = ") VALUES(\"";
         if (id >= 0) {
@@ -149,7 +194,7 @@
             //#todo errInfo
             return "tableName or fieldValues is NULL";
         }
-        std::string sql = "DELETE from " + tableName + " where 1 = 1 ";
+        std::string sql = "DELETE from '" + tableName + "' where 1 = 1 ";
         for (auto item : fieldValues) {
             if (item.first.size() != 0) {
                 sql.append("and " + item.first + " = '" + item.second + "' ");
@@ -169,11 +214,11 @@
             //#todo errInfo
             return "tableName or fieldValues is NULL";
         }
-        std::string sql = "INSERT INTO " + tableName + " (";
+        std::string sql = "INSERT INTO '" + tableName + "' (";
         std::string sqlTemp = sql;
         std::string sql2 = ") VALUES('";
         for (auto item : fieldValues) {
-            if (item.first.size() != 0) {
+            if (item.first.size() != 0 && item.second.size() != 0) {
                 sql.append(item.first + ",");
                 sql2.append(item.second + "','");
             }
@@ -182,7 +227,7 @@
         sql = sql.substr(0, sql.length() - 1);
         //sql2 delete 2 ,'  add )
         sql2 = sql2.substr(0, sql2.length() - 2);
-        sql2.append(" )");
+        sql2.append(" );");
         sql.append(sql2);
         return sql;
     }
@@ -193,6 +238,9 @@
      * @return sql
      */
     std::string getInitDBSql() {
+//        %%      ALTER TABLE sys_o_tables ADD COLUMN uploadFlag varchar(255) DEFAULT 0;
+//        %%      ALTER TABLE sys_o_tables ADD COLUMN cmpThreshold varchar(255) DEFAULT 60;
+//        %%      ALTER TABLE sys_o_tables ADD COLUMN enabled varchar(255) DEFAULT 1;
         std::string sql = "CREATE TABLE \"main\".\"sys_o_tables\" (";
         sql.append(" uuid        varchar(255) PRIMARY KEY, ");
 //        sql.append(" ClusterName varchar(255) DEFAULT NULL,");//鏈湴搴撲笉闇�瑕�
@@ -205,7 +253,10 @@
         sql.append(" create_time BLOB default (datetime('now', 'localtime')),");
         sql.append(" update_time varchar(255) DEFAULT NULL,");
         sql.append(" create_by   varchar(255) DEFAULT NULL,");
-        sql.append(" del_flag    varchar(255) DEFAULT 0");
+        sql.append(" del_flag    varchar(255) DEFAULT 0,");
+        sql.append(" uploadFlag  varchar(255) DEFAULT 0,");
+        sql.append(" cmpThreshold    varchar(255) DEFAULT 60,");
+        sql.append(" enabled     varchar(255) DEFAULT 1");
         sql.append(");");
         return sql;
     }
@@ -222,9 +273,9 @@
             return "tableName is NULL";
         }
         // 浜哄憳淇℃伅琛�
-        std::string sql = "CREATE TABLE " + g_dbName + ".";
+        std::string sql = "CREATE TABLE " + g_dbName + ".'";
         sql.append(tableName);
-        sql.append(" (  uuid        varchar(255) PRIMARY KEY,");
+        sql.append("' (  uuid        varchar(255) PRIMARY KEY,");
         sql.append("personName  varchar(255) DEFAULT NULL,");
         sql.append("age         varchar(255) DEFAULT NULL,");
         sql.append("sex         varchar(255) DEFAULT NULL,");
@@ -233,11 +284,13 @@
         sql.append("create_time BLOB         DEFAULT (datetime('now', 'localtime')),");
         sql.append("update_time DATETIME     DEFAULT NULL,");
         sql.append("create_by   varchar(255) DEFAULT NULL,");
-        sql.append("del_flag    INTEGER      DEFAULT 0");
+        sql.append("del_flag    INTEGER      DEFAULT 0,");
+        sql.append("monitorLevel    varchar(255)      DEFAULT 0,");
+        sql.append("    enabled     varchar(255) DEFAULT 1");
         sql.append(");");
         // 浜鸿劯鐗瑰緛琛�
-        sql.append("CREATE TABLE " + g_dbName + ".");
-        sql.append(tableName + "_fea");
+        sql.append("CREATE TABLE " + g_dbName + ".'");
+        sql.append(tableName + "_fea'");
         sql.append(" (  uuid        varchar(255) PRIMARY KEY,");
         sql.append("    feature     BLOB NOT NULL,");
         sql.append("    faceUrl     BLOB NOT NULL,");
@@ -249,7 +302,12 @@
         return sql;
     }
 
-
+    /***
+     * 鑾峰彇鏇存柊浜鸿劯涓氬姟淇℃伅琛ㄧ殑sql璇彞
+     * @param tableName
+     * @param fieldValues
+     * @return
+     */
     std::string getUpdateFaceTableSql(std::string tableName, FieldValues &fieldValues) {
         if (tableName.size() == 0) {
             //#todo errInfo
@@ -265,25 +323,33 @@
             SQLERR("fieldValues size is error");
             return "";
         }
-        std::string sql = "update ";
-        sql.append(tableName + " set ");
+        std::string sql = "update '";
+        sql.append(tableName + "' set ");
         for (auto &item :fieldValues) {
+            if (item.second.size() == 0) {
+                continue;
+            }
             sql.append(item.first + " =  '" + item.second + "',");
         }
         sql.append(" update_time ='" + AppUtil::getTimeSecString() + "'");
-        sql.append(" where uuid ='" + uuid + "'");
+        sql.append(" where uuid ='" + uuid + "';");
         return sql;
     }
 
 
     //#TODO 浜鸿劯琛ㄩ渶瑕佸垹闄や袱涓�
+    /***
+     * 鑾峰彇鍒犻櫎浜鸿劯琛ㄧ殑sql璇彞
+     * @param tableName
+     * @return
+     */
     std::string getDeleteFaceTableSql(std::string tableName) {
         if (tableName.size() == 0) {
             //#todo errInfo
             return "tableName is NULL";
         }
-        std::string sql = "DROP TABLE " + g_dbName + "." + tableName + ";";
-        sql.append("DROP TABLE " + g_dbName + "." + tableName + "_fea;");
+        std::string sql = "DROP TABLE " + g_dbName + ".'" + tableName + "';";
+        sql.append("DROP TABLE " + g_dbName + ".'" + tableName + "_fea';");
         return sql;
     }
 
diff --git a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
index 6166a4f..dd25e47 100644
--- a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
+++ b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
@@ -10,11 +10,10 @@
 
 RtspAnalysManager::RtspAnalysManager(LDBTool *_dbTool) : m_lDBTool(nullptr), m_maxCount(50), m_currentCount(0) {
     INFO("MYH DEBUG HERE");
-    m_lDBTool=new LDBTool;
+    m_lDBTool = new LDBTool;
     init();
 
 }
-
 
 
 static std::string rtspAddrBuild(std::string ip, const int port, std::string username,
@@ -50,27 +49,25 @@
     if (lst.size() > 0) {
         int startCamNO = appPref.getIntData("CamStart") * appPref.getIntData("CamStep");
         int CamCount = appPref.getIntData("CamStep");
-        INFO("StartCamNO: "<<startCamNO<<" CamStep: "<<CamCount);
+        INFO("StartCamNO: " << startCamNO << " CamStep: " << CamCount);
         auto itor = lst.begin();
 
-        if(startCamNO >= lst.size())
-        {
+        if (startCamNO >= lst.size()) {
             ERR("startCamNO > lst.size()");
             return;
         }
 
-        for(int i=0; i < startCamNO; i++){
+        for (int i = 0; i < startCamNO; i++) {
 
             std::string t_camIdex = itor->str_cam_dev_id.toStdString();
             std::string rtsp_url = rtspAddrBuild(itor->str_ip.toStdString(), 554, itor->str_username.toStdString(),
                                                  itor->str_password.toStdString(), itor->str_brand.toStdString());
-            INFO("JumpCam: "<<t_camIdex<<"  URL: "<<rtsp_url);
+            INFO("JumpCam: " << t_camIdex << "  URL: " << rtsp_url);
             itor++;
         }
 
         for (int i = 0; i < CamCount; i++) {
-            if (itor == lst.end())
-            {
+            if (itor == lst.end()) {
                 ERR("itor == lst.end()");
                 return;
             }
@@ -102,7 +99,7 @@
 RtspAnalysManager::~RtspAnalysManager() {
     INFO("Program Exit");
     for (auto controller: m_controllers) {
-        INFO("Delete Controller: "<<controller.first);
+        INFO("Delete Controller: " << controller.first);
         delete controller.second;
     }
     m_controllers.clear();
@@ -116,7 +113,7 @@
  * @param rtsp 涓婇潰鐨勬憚鍍忔満瀵瑰簲鐨勮棰戣矾寰�
  * @return -1 娣诲姞澶辫触,0 娣诲姞鎴愬姛
  */
-int RtspAnalysManager::addCamera(const std::string &index, const std::string& rtsp) {
+int RtspAnalysManager::addCamera(const std::string &index, const std::string &rtsp) {
     auto lst = m_lDBTool->searchCamDevTableAll();
     Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
 
@@ -126,13 +123,13 @@
             ERR("addCamera faild, camera's num is full!")
             return -1;
         }
-        INFO("RTSP: "<<rtsp<<"  INDEX:"<<index);
+        INFO("RTSP: " << rtsp << "  INDEX:" << index);
         m_imgRedisControllers[index] = new RtspImageRedisElement(index);
         m_imgRedisControllers[index]->start();
 
-        m_controllers[index] = new RtspCaptureElement(rtsp,index, 25,3000,0,this);
+        m_controllers[index] = new RtspCaptureElement(rtsp, index, 25, 3000, 0, this);
         m_controllers[index]->start();
-        m_controllers[index]->SetVideoMinMaxSeconds(lst_dev.n_cut_min_duration,lst_dev.n_cut_max_duration);
+        m_controllers[index]->SetVideoMinMaxSeconds(lst_dev.n_cut_min_duration, lst_dev.n_cut_max_duration);
         m_currentCount++;
         return 0;
 
@@ -212,37 +209,31 @@
 
 
 //褰曞彇瑙嗛鐨凴PC鐨勬帴鍙e嚱鏁�
-::std::string RtspAnalysManager::recordVideo(const ::std::string& name, const ::Ice::Current&)
-{
-    INFO("Record Video For: "<<name);
-    ImageName_s_t nameSt=ImageName_s_t::fromString(name);
-    if(nameSt.Valid())
-    {
+::std::string RtspAnalysManager::recordVideo(const ::std::string &name, const ::Ice::Current &) {
+    INFO("Record Video For: " << name);
+    ImageName_s_t nameSt = ImageName_s_t::fromString(name);
+    if (nameSt.Valid()) {
         auto pCaptureElem = m_controllers.find(nameSt.m_camId);
-        if(pCaptureElem!= m_controllers.end())
-        {
+        if (pCaptureElem != m_controllers.end()) {
             pCaptureElem->second->SaveVideo(name);
-        } else{
-            ERR("Can not Find CamId "<<nameSt.m_camId);
+        } else {
+            ERR("Can not Find CamId " << nameSt.m_camId);
         }
-    }
-    else{
-        ERR("Record Video Failed:Name Not Valid  Name:  "<<name);
+    } else {
+        ERR("Record Video Failed:Name Not Valid  Name:  " << name);
     }
     return name;
 }
 
 //淇濆瓨瑙嗛鍒癛tspImageRedis鐨勯槦鍒�,鐢盧tspCaptureElement璋冪敤
-bool RtspAnalysManager::SaveImageToRedis(const std::string& camId,const std::string& imageName,const cv::Mat& img)
-{
+bool RtspAnalysManager::SaveImageToRedis(const std::string &camId, const std::string &imageName, const cv::Mat &img) {
     INFO("MYH DEBUG HERE");
     auto item = m_imgRedisControllers.find(camId);
-    if(item!=m_imgRedisControllers.end())
-    {
-        INFO("Save Succeed Cam: "<<camId<<" ImageKey: "<<imageName);
-        item->second->SaveImage(imageName,img);
+    if (item != m_imgRedisControllers.end()) {
+        INFO("Save Succeed Cam: " << camId << " ImageKey: " << imageName);
+        item->second->SaveImage(imageName, img);
     } else {
-        ERR("Save Failed Cam: "<<camId<<" ImageKey: "<<imageName);
+        ERR("Save Failed Cam: " << camId << " ImageKey: " << imageName);
     }
     INFO("MYH DEBUG HERE");
     return true;
diff --git a/QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.h b/QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.h
index e52ea77..144b561 100644
--- a/QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.h
+++ b/QiaoJiaSystem/VideoToImageMulth/RtspCaptureElement.h
@@ -41,7 +41,7 @@
         std::string m_path;
 
         // Redis鐨勫伐鍏风被
-        HiredisTool m_redisTool;
+//        HiredisTool m_redisTool;
 
         //瀵逛繚瀛樺埌Redis鐨勫浘鐗囪繘琛岃鏁�
         std::atomic<int> m_picCount{0};
diff --git a/QiaoJiaSystem/VideoToImageMulth/RtspImageRedis.h b/QiaoJiaSystem/VideoToImageMulth/RtspImageRedis.h
index 12d0197..716b5cc 100644
--- a/QiaoJiaSystem/VideoToImageMulth/RtspImageRedis.h
+++ b/QiaoJiaSystem/VideoToImageMulth/RtspImageRedis.h
@@ -47,7 +47,7 @@
     std::string m_camId;
 
     //姣忓彴鎽勫儚鏈轰繚瀛樺埌Redis鐨勫浘鐗囨暟閲忕殑鏈�澶у��
-    const int M_CAM_PIC_MAX_COUNT = 25;
+    const int M_CAM_PIC_MAX_COUNT = 3;
 };
 
 #endif // VIDEOCAPTUREELEMENT_H
diff --git a/QiaoJiaSystem/YoloServer/main.cpp b/QiaoJiaSystem/YoloServer/main.cpp
index bd62a14..68b22b9 100644
--- a/QiaoJiaSystem/YoloServer/main.cpp
+++ b/QiaoJiaSystem/YoloServer/main.cpp
@@ -30,12 +30,12 @@
 //        return -1;
 //    }
 
-    int gpuindex = 1;
+    int gpuindex = 0;
     int poolNum = 1;
     int portNum = 10003;
 
     appPref.setIntData("gpu.index", gpuindex);
-    appPref.setFloatData("thresh.detect", 0.7);
+    appPref.setFloatData("thresh.detect", 0.85);
     appPref.setIntData("poolNum", poolNum);
 
     IceRpcServer<YoloDetectServerI> server("yoloServer", portNum, "tcp");
diff --git a/syncDBTool/ErlangDbTool.cpp b/syncDBTool/ErlangDbTool.cpp
index 8c3e12a..e736943 100755
--- a/syncDBTool/ErlangDbTool.cpp
+++ b/syncDBTool/ErlangDbTool.cpp
@@ -639,6 +639,14 @@
     return false;
 }
 
+bool ErlangTool::ErlangDbTool::createDatabase(std::string t_tableName, FieldValues &fieldValues) {
+//    #todo 璁板緱娴嬭瘯涓枃
+    std::string strSql = getCreateFaceTableSql(t_tableName);
+    strSql.append(getInsertSql("sys_o_tables", fieldValues));
+    getExecSqlResult(strSql);
+}
+
+
 bool ErlangTool::ErlangDbTool::updateDatabase(std::string UUID, std::string TableType, std::string TableName,
                                               bool SyncType, std::string BwType, std::string StartTime,
                                               std::string EndTime) {
@@ -722,6 +730,86 @@
     return false;
 }
 
+bool ErlangTool::ErlangDbTool::updateDatabase(std::string t_tableName, FieldValues &fieldValues) {
+    //    #todo 璁板緱娴嬭瘯涓枃
+    std::string strSql = getUpdateFaceTableSql(t_tableName, fieldValues);
+    return getExecSqlResult(strSql);
+
+}
+
+bool ErlangTool::ErlangDbTool::getExecSqlResult(const std::string &strSql) {
+    ErlangTool::LockG lock(m_mutex);
+//            m_mutex.lock();
+    m_ret = resetConn();
+    if (!m_ret) {
+        //#todo error message
+        std::cout << __FILE__ << __FUNCTION__ << __LINE__ << " error " << this->m_ret << "  " << this->m_fd
+                  << std::endl;
+        return false;
+    }
+
+    ErlMessage emsg;             /* Incoming message */
+    int ret = -1;
+    ETERM *arrlist[7];
+    arrlist[0] = erl_mk_string(strSql.c_str());
+    ETERM *list = erl_mk_list(arrlist, 1);
+
+    ret = erl_rpc_to(m_fd, "syncDB", "exeSomeSql", list);
+    if (ret == ERL_TICK) {
+        ret = erl_rpc_from(m_fd, TIMEOUT, &emsg);
+        //erl_close_connection(m_fd);
+//                m_mutex.unlock();
+        if (ret == ERL_MSG) {
+            std::map<std::__cxx11::string, std::__cxx11::string> t_results;
+
+            ETERM *tail_list;
+            ETERM *list_ret[1000], *arr_ret[2];
+            ETERM *key, *value;
+            ETERM *tuplep[6];
+
+            arr_ret[0] = erl_element(2, emsg.msg);
+            int erlLength = erl_length(arr_ret[0]);
+            printf("arr_ret[0]:%d\n", erlLength);
+            list_ret[0] = erl_hd(arr_ret[0]);
+            tail_list = erl_tl(arr_ret[0]);
+            for (int i = 0; i < erlLength; i++) {
+                if (i > 0) {
+                    list_ret[i] = erl_hd(tail_list);
+                    tail_list = erl_tl(tail_list);
+                }
+//                    printf("list_ret[%d]:%d\n", i, erl_length(list_ret[i]));
+                tuplep[0] = erl_hd(list_ret[i]);
+                key = erl_element(1, list_ret[i]);
+                value = erl_element(2, list_ret[i]);
+//                    printf("key:%s\n", ERL_ATOM_PTR(key));
+
+                switch (ErlangTool::checkETERMType(value)) {
+                    case ERL_ATOM: {
+//                            int atomSize = ERL_ATOM_SIZE(value);
+                        char *atomValue = ERL_ATOM_PTR(value);
+//                            printf("value is a atom: atomSize:%d, atomValue:%s \n\r", atomSize, atomValue);
+                        t_results.insert(std::make_pair(ERL_ATOM_PTR(key), atomValue));
+                        break;
+                    }
+                    default:
+                        printf("error add case todo \n\r");
+                }
+                ErlangTool::erlangFreeEterm(4, key, value, tuplep[0], list_ret[i]);
+            }
+            ErlangTool::erlangFreeEterm(2, tail_list, arr_ret[0]);
+            erl_eterm_release();
+            auto it = t_results.find("atomic");
+            if (t_results.size() > 0 && t_results.end() != it && it->second == "ok") {
+                return true;
+            }
+        }
+    }
+    erl_free_array(arrlist, 1);
+//            erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list);
+    erl_eterm_release();
+    return false;
+}
+
 bool ErlangTool::ErlangDbTool::deleteDatabase(std::string TableType, std::string TableName, bool SyncType) {
     LockG lock(m_mutex);
 //            m_mutex.lock();
@@ -791,6 +879,19 @@
     erl_free_array(arrlist, 2);
     erlangFreeEterm(4, emsg.to, emsg.msg, emsg.from, list);
     return false;
+}
+
+
+bool ErlangTool::ErlangDbTool::deleteDatabase(std::string t_tableName) {
+
+    FieldValues fieldValues;
+    fieldValues.insert(std::make_pair("uuid", t_tableName));
+    fieldValues.insert(std::make_pair("del_flag", "1"));
+    std::string strSql = getUpdateFaceTableSql("sys_o_tables", fieldValues);
+    strSql.append("DROP TABLE '" + t_tableName + "';DROP TABLE '" + t_tableName + "_fea';");
+    //    #todo 璁板緱娴嬭瘯涓枃
+    return getExecSqlResult(strSql);
+
 }
 
 // 鍜宔rlang浜や簰
@@ -894,7 +995,7 @@
     map_TabDataCache tabDataCache;
 
     QString sql = QString::fromStdString(
-        "SELECT  uuid,tableName,tableType,bwType,startTime,endTime FROM sys_o_tables where del_flag=0;");
+        "SELECT  uuid,tableName,tableType,bwType,startTime,endTime,uploadFlag,cmpThreshold,enabled,create_by FROM sys_o_tables where del_flag=0;");
     QSqlQuery query(g_syncDbFile);
     query.prepare(sql);
     if (!query.exec()) {
@@ -908,6 +1009,10 @@
             t_table_info.bwType = query.value(3).toString().toStdString();
             t_table_info.startTime = query.value(4).toString().toStdString();
             t_table_info.endTime = query.value(5).toString().toStdString();
+            t_table_info.uploadFlag = query.value(6).toString().toStdString();
+            t_table_info.cmpThreshold = query.value(7).toString().toStdString();
+            t_table_info.enabled = query.value(8).toString().toStdString();
+            t_table_info.create_by = query.value(9).toString().toStdString();
 
             tabDataCache.insert(std::make_pair(t_table_info.uuid, t_table_info));
         }
@@ -1080,6 +1185,35 @@
     return false;
 }
 
+bool ErlangTool::ErlangDbTool::addPerson(std::string t_tableName, AddFaceData &faceData, FieldValues &fieldValues) {
+//    #todo 璁板緱娴嬭瘯涓枃
+    std::string strSql = getInsertSql(t_tableName, fieldValues);
+    fieldValues.clear();
+    fieldValues.insert(make_pair("uuid", faceData.uuid));
+    fieldValues.insert(make_pair("faceUrl", faceData.faceUrl));
+    fieldValues.insert(make_pair("feature", faceData.feature_base64));
+
+    std::string strSqlFea = getInsertSql(t_tableName + "_fea", fieldValues);
+    strSql.append(strSqlFea);
+    //    #todo 璁板緱娴嬭瘯涓枃  鍙湁浜哄憳淇℃伅琛ㄦ洿鏂帮紝鐗瑰緛鏇存柊鏆傛椂娌″仛
+
+    return getExecSqlResult(strSql);
+}
+
+bool ErlangTool::ErlangDbTool::updatePerson(std::string t_tableName, AddFaceData &faceData, FieldValues &fieldValues) {
+//    #todo 璁板緱娴嬭瘯涓枃
+    std::string strSql = getUpdateFaceTableSql(t_tableName, fieldValues);
+    fieldValues.clear();
+    fieldValues.insert(make_pair("uuid", faceData.uuid));
+    fieldValues.insert(make_pair("faceUrl", faceData.faceUrl));
+
+    fieldValues.insert(make_pair("feature", faceData.feature_base64));
+
+    std::string strSqlFea = getInsertSql(t_tableName + "_fea", fieldValues);
+    strSql.append(strSqlFea);
+
+    return getExecSqlResult(strSql);
+}
 
 ErlangTool::vec_AddDataCache
 ErlangTool::ErlangDbTool::addPersons(std::string TableUuid, std::vector<SyncDB::AddPersonInfo> &tmpPer) {
@@ -1480,7 +1614,8 @@
     }
     if (str_tableUuid.size() > 0) {
         QString sql = QString::fromStdString(
-            "Select a.uuid as id ,a.faceUrl as img,a.feature,b.idCard as idcard from '" + str_tableUuid +
+            "Select a.uuid as id ,a.faceUrl as img,a.feature,b.idCard as idcard,b.enable,b.monitorLevel from '" +
+            str_tableUuid +
             "_fea' as a ,'" + str_tableUuid + "' as b  where a.uuid = b.uuid and ( a.del_flag=0 AND b.del_flag=0);");
         QSqlQuery query(g_syncDbFile);
         query.prepare(sql);
@@ -1493,6 +1628,8 @@
                 t_feature_info.img = query.value(1).toString().toStdString();
                 t_feature_info.feature = query.value(2).toString().toStdString();
                 t_feature_info.idcard = query.value(3).toString().toStdString();
+                t_feature_info.enable = query.value(4).toString().toStdString();
+                t_feature_info.monLevel = query.value(5).toString().toStdString();
 
                 dataCache.insert(std::make_pair(t_feature_info.id, t_feature_info));
             }
@@ -1517,9 +1654,12 @@
         }
     }
     if (str_tableUuid.size() > 0) {
+//        QString sql = QString::fromStdString(
+//            "Select b.uuid as id,b.faceUrl as img,a.idCard as idcard,a.enable,a.monitorLevel from '" + str_tableUuid +
+//            "' as a, '" + str_tableUuid + "_fea' As b  where a.uuid = b.uuid and ( a.del_flag=0 AND b.del_flag=0);");
         QString sql = QString::fromStdString(
-            "Select b.uuid as id,b.faceUrl as img,a.idCard as idcard from '" + str_tableUuid + "' as a, '" +
-            str_tableUuid + "_fea' As b  where a.uuid = b.uuid and ( a.del_flag=0 AND b.del_flag=0);");
+            "Select b.uuid as id,b.faceUrl as img,a.idCard as idcard from '" + str_tableUuid +
+            "' as a, '" + str_tableUuid + "_fea' As b  where a.uuid = b.uuid and ( a.del_flag=0 AND b.del_flag=0);");
         QSqlQuery query(g_syncDbFile);
         query.prepare(sql);
         if (!query.exec()) {
@@ -1530,6 +1670,8 @@
                 t_feature_info.id = query.value(0).toString().toStdString();
                 t_feature_info.img = query.value(1).toString().toStdString();
                 t_feature_info.idcard = query.value(2).toString().toStdString();
+//                t_feature_info.enable = query.value(3).toString().toStdString();
+//                t_feature_info.monLevel = query.value(4).toString().toStdString();
 
                 dataCache.insert(std::make_pair(t_feature_info.id, t_feature_info));
             }
diff --git a/syncDBTool/ErlangDbTool.h b/syncDBTool/ErlangDbTool.h
index 76ce646..72cebcd 100755
--- a/syncDBTool/ErlangDbTool.h
+++ b/syncDBTool/ErlangDbTool.h
@@ -21,6 +21,7 @@
 #include <stdarg.h>
 #include <jsoncpp/json/json.h>
 #include <arpa/inet.h>
+#include <SqliteToolkit.hpp>
 
 #include "erl_interface.h"
 #include "ei.h"
@@ -135,6 +136,8 @@
     private:
         void initCNode();
 
+        bool getExecSqlResult(const std::string &strSql);
+
     public:
         //#todo setCNodeName
 
@@ -189,10 +192,27 @@
          * @param TableName
          * @param SyncType true 1||false 0
          * @param BwType   "Black"1||"White"0
+         * @param StartTime
+         * @param EndTime
          * @return 鍒涘缓鐘舵��
          */
         bool createDatabase(std::string TableType, std::string TableName, bool SyncType, std::string BwType,
                             std::string StartTime = "", std::string EndTime = "");
+
+        /***
+         * 鍒涘缓搴曞簱琛�
+         * @param TableType TableType car||person
+         * @param TableName
+         * @param SyncType  true 1||false 0
+         * @param BwType    "Black"1||"White"0
+         * @param UploadFlag 鏄惁涓婁紶
+         * @param CmpThreshold 瀵规瘮闃堝��
+         * @param Enabled 鏄惁鍚敤
+         * @param StartTime
+         * @param EndTime
+         * @return
+         */
+        bool createDatabase(std::string t_tableName, FieldValues &fieldValues);
 
         /***
          * 鏇存柊搴曞簱琛�
@@ -205,6 +225,8 @@
         bool updateDatabase(std::string UUID, std::string TableType, std::string TableName, bool SyncType,
                             std::string BwType, std::string StartTime = "", std::string EndTime = "");
 
+        bool updateDatabase(std::string t_tableName, FieldValues &fieldValues);
+
         /***
          * 鍒犻櫎鏁版嵁琛�
          * @param TableType car||person
@@ -213,6 +235,8 @@
          * @return
          */
         bool deleteDatabase(std::string TableType, std::string TableName, bool SyncType);
+
+        bool deleteDatabase(std::string t_tableName);
 
         /***
          * 鏌ヨ鎵�鏈夋暟鎹〃
@@ -242,6 +266,11 @@
                        std::string IdCard = " ", std::string PersonName = " ", std::string Age = " ",
                        std::string Sex = " ", std::string PhoneNum = " ");
 
+        bool
+        ErlangTool::ErlangDbTool::addPerson(std::string t_tableName, AddFaceData &faceData, FieldValues &fieldValues);
+
+        bool updatePerson(std::string t_tableName, AddFaceData &faceData, FieldValues &fieldValues);
+
         vec_AddDataCache addPersons(std::string TableUuid, std::vector<SyncDB::AddPersonInfo> &tmpPer);
 
         /***
diff --git a/syncDBTool/SyncDB.hpp b/syncDBTool/SyncDB.hpp
index 82919ca..20edb66 100755
--- a/syncDBTool/SyncDB.hpp
+++ b/syncDBTool/SyncDB.hpp
@@ -21,6 +21,8 @@
         update_time,
         img,
         idcard,
+        enable,
+        monLevel,
         evEnd
     };
 
@@ -36,6 +38,8 @@
         map_Fea_InfoString2Values["update_time"] = Feature_InfoStringValue::update_time;
         map_Fea_InfoString2Values["img"] = Feature_InfoStringValue::img;
         map_Fea_InfoString2Values["idcard"] = Feature_InfoStringValue::idcard;
+        map_Fea_InfoString2Values["enable"] = Feature_InfoStringValue::enable;
+        map_Fea_InfoString2Values["monitorLevel"] = Feature_InfoStringValue::monLevel;
         map_Fea_InfoString2Values["end"] = evEnd;
     }
 
@@ -81,6 +85,12 @@
                     case Feature_InfoStringValue::idcard:
                         idcard = value;
                         break;
+                    case Feature_InfoStringValue::enable:
+                        enable = value;
+                        break;
+                    case Feature_InfoStringValue::monLevel:
+                        monLevel = value;
+                        break;
                     default:
                         ERR(key << " is an invalid string. s_mapStringValues now contains "
                                 << map_Fea_InfoString2Values.size() << " entries.");
@@ -102,6 +112,9 @@
         std::string update_time;
         std::string img;
         std::string idcard;
+        std::string enable;
+        std::string monLevel;
+
 
 //        value is a atom: atomSize:19, atomValue:test@192.168.50.216
 //        value is a list:2018-08-08 20:17:11
@@ -271,6 +284,9 @@
         tab_uuid,
         tab_startTime,
         tab_endTime,
+        tab_uploadFlag,
+        tab_cmpThreshold,
+        tab_enabled,
         tab_evEnd
     };
 
@@ -290,6 +306,9 @@
         map_Tab_InfoString2Values["uuid"] = Table_InfoStringValue::tab_uuid;
         map_Tab_InfoString2Values["startTime"] = Table_InfoStringValue::tab_startTime;
         map_Tab_InfoString2Values["endTime"] = Table_InfoStringValue::tab_endTime;
+        map_Tab_InfoString2Values["uploadFlag"] = Table_InfoStringValue::tab_uploadFlag;
+        map_Tab_InfoString2Values["cmpThreshold"] = Table_InfoStringValue::tab_cmpThreshold;
+        map_Tab_InfoString2Values["enabled"] = Table_InfoStringValue::tab_enabled;
         map_Tab_InfoString2Values["end"] = Table_InfoStringValue::tab_evEnd;
     }
 
@@ -299,8 +318,8 @@
     struct Table_Info {
     public:
         Table_Info() :
-            create_by(""), create_time(""), del_flag(""), tableDesc(""), tableName(""), tableType(""),
-            update_time(""), uuid(""), bwType(""), startTime(""), endTime("") {
+            create_by(""), create_time(""), del_flag(""), tableDesc(""), tableName(""), tableType(""), update_time(""),
+            uuid(""), bwType(""), startTime(""), endTime(""), uploadFlag(""), cmpThreshold(""), enabled("") {
 //            Initialize();
         }
 
@@ -351,6 +370,15 @@
                     case Table_InfoStringValue::tab_endTime:
                         endTime = value;
                         break;
+                    case Table_InfoStringValue::tab_uploadFlag:
+                        uploadFlag = value;
+                        break;
+                    case Table_InfoStringValue::tab_cmpThreshold:
+                        cmpThreshold = value;
+                        break;
+                    case Table_InfoStringValue::tab_enabled:
+                        enabled = value;
+                        break;
                     default:
                         ERR(key << " is an invalid string. s_mapStringValues now contains "
                                 << map_Fea_InfoString2Values.size() << " entries.");
@@ -376,6 +404,9 @@
         std::string bwType;
         std::string startTime;
         std::string endTime;
+        std::string uploadFlag;
+        std::string cmpThreshold;
+        std::string enabled;
 
     private:
     };

--
Gitblit v1.8.0