From a2dfb4907fd11e0a64ba16419dce066509462297 Mon Sep 17 00:00:00 2001
From: pansen <pansen626@sina.com>
Date: 星期三, 06 三月 2019 10:04:45 +0800
Subject: [PATCH] 修改部分bug

---
 QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.h              |    4 
 QiaoJiaSystem/EncodeServer/CMakeLists.txt                        |   21 +-
 QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp            |   30 +-
 QiaoJiaSystem/GB28181DecoderModel/GB28181Server.cpp              |    2 
 QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h   |    3 
 QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.h              |    4 
 QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp |   10 
 QiaoJiaSystem/VideoToImageMulth/main.cpp                         |  128 ++++++++------
 QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp           |   22 +
 QiaoJiaSystem/StructureApp/FaceExtractElement.cpp                |    3 
 QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp            |  257 ++++++++++++++--------------
 11 files changed, 256 insertions(+), 228 deletions(-)

diff --git a/QiaoJiaSystem/EncodeServer/CMakeLists.txt b/QiaoJiaSystem/EncodeServer/CMakeLists.txt
index c5685b6..660085b 100644
--- a/QiaoJiaSystem/EncodeServer/CMakeLists.txt
+++ b/QiaoJiaSystem/EncodeServer/CMakeLists.txt
@@ -56,12 +56,10 @@
     ../../../BasicPlatForm/basic/pipe/
 
 
-
     ../../../BasicPlatForm/libs/opencv/include
 
     ../../../BasicPlatForm/libs/ffmpeg/include
     ../../../BasicPlatForm/libs/jsoncpp/include
-
 
 
     /usr/include/x86_64-linux-gnu/qt5
@@ -79,22 +77,23 @@
     ../../../BasicPlatForm/libs/ffmpeg/lib
     ../../../BasicPlatForm/libs/jsoncpp/lib
 
-#    ../../../BasicPlatForm/libs/libuuid/lib
+    #    ../../../BasicPlatForm/libs/libuuid/lib
 
 
     ../../../BasicPlatForm/libs/hiredis-master/lib
 )
 
 add_executable(${PROJECT_NAME}
-      ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoChangeScore.cpp
-       ../../../BasicPlatForm/basic/pipe_element/ffmpeg/FfmpegElement.cpp
-       ../StructureApp/NewRecordVideoElement.cpp
-       ../../../BasicPlatForm/basic/timer_counter/TimerRecorder.cpp
+    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoChangeScore.cpp
+    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/FfmpegElement.cpp
+    ../StructureApp/NewRecordVideoElement.cpp
+    ../../../BasicPlatForm/basic/timer_counter/TimerRecorder.cpp
+    ../../../BasicPlatForm/basic/util/BASE64/Base64.cpp
 
-        EncodeVideoManager.cpp
-       EncodeVideo.cpp
-       ../StructureApp/HiredisTool.cpp
-       main.cpp
+    EncodeVideoManager.cpp
+    EncodeVideo.cpp
+    ../StructureApp/HiredisTool.cpp
+    main.cpp
     )
 target_link_libraries(${PROJECT_NAME}
     ${LIBS}
diff --git a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
index ebf1de9..5106cbf 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
+++ b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
@@ -128,6 +128,10 @@
     return bufsize;
 }
 
+/***
+ * 瑙g爜绾跨▼
+ * @param p_this
+ */
 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;
@@ -188,11 +192,6 @@
         //# 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);
@@ -201,12 +200,17 @@
             usleep(40000);
             continue;
         }
+        //DBG("GotPicture "<<m_camId<<":"<<frame_number);
+        //鏀惧湪姝ゅ鏄洜涓轰箣鍓嶆斁鍦ㄥ墠闈�,鏀跺埌鐨勫抚涓嶅畬鎴�
+        p_this->SaveToPacketVector(pkt);
+        p_this->CheckSave();
+
 //        BASICGB28181::avframe_to_cvmat(frame).copyTo(p_this->m_image);
         p_this->m_image = std::move(BASICGB28181::avframe_to_cvmat(frame));
 
 #ifdef TestCode
         {
-//            TestCode
+//            TestCode 娴嬭瘯浠g爜淇濆瓨鍥剧墖鍒版湰鍦�
             ClockTimer cl("TestCode");
             std::string strNewTime2 = AppUtil::getTimeUSecString();
             cv::putText(p_this->m_image, strNewTime2, cv::Point(408, 540), cv::HersheyFonts::FONT_HERSHEY_PLAIN,
@@ -228,7 +232,7 @@
 #ifdef TestCode
         DBG("emitSigal(\"DecoderImageOK\") begin");
 #endif
-
+        //瑙﹀彂淇″彿
         gSignalLock.emitSigal(p_this->m_camIdx + "DecoderImageOK");
 //#ifdef TestCode
 //        DBG("emitSigal(\"DecoderImageOK\") after");
@@ -278,7 +282,7 @@
 
 bool BASICGB28181::FFmpegDecoderJPG::stopThd() {
     TryCath(
-        DBG(m_camIdx << "  FFmpegDecoderJPG stopThd ... ");
+        DBG(m_camIdx << "  FFmpegDecoderJPG stopThd ... " << m_camIdx);
         m_running = false;
     );
     return true;
@@ -380,9 +384,11 @@
         int64_t firstKeyFrameDts = m_packetsVec[0].m_packet.dts;
         for (const auto &item:m_packetsVec) {
             if (item.m_frameId < lastFrameId) {
+                DBG("item.m_frameId < lastFrameId   " << item.m_frameId << "  " << lastFrameId);
                 conversion(const_cast<AVPacket *> (&item.m_packet), firstKeyFramePts, firstKeyFrameDts, video_st);
                 av_write_frame(m_pOutFmtCtx, &item.m_packet);
             } else {
+                DBG("item.m_frameId > lastFrameId   " << item.m_frameId << "  " << lastFrameId);
                 break;
             }
         }
diff --git a/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.cpp b/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.cpp
index 88a8c6c..44378a5 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.cpp
+++ b/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.cpp
@@ -2,6 +2,7 @@
 // Created by ps on 19-3-1.
 //
 
+#include <basic/debug/Debug.h>
 #include "GB28181Server.h"
 
 bool bGetLoaclRes = {false};
@@ -50,6 +51,7 @@
 bool GB28181Server::initServer() {
 
     bool iRet = C_InitSDK(&GBServerParam, &MysqlConnParam, NULL, enventcallback);
+    DBG("iRet is " << iRet);
     sleep(90);
 
     return iRet;
diff --git a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
index d2b30cd..bf433a6 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
+++ b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
@@ -13,12 +13,10 @@
 
 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) {
+                                                                     int gpuIdx, RtspAnalysManager *manager)
+    : m_chanPubID(chanPubID), m_fps(fps), m_running(false),
+      m_waitSignal(false), m_streamTransType(streamTransType),
+      m_gpuIdx(gpuIdx), m_userdata((long) this), m_pManager(manager) {
 //    m_chanPubID = chanPubID;
 
     m_cutPath = appPref.getStringData("user.loop.absolute.path");
diff --git a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
index 162b8fe..77751c3 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
+++ b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
@@ -17,7 +17,8 @@
 
     class VideoCaptureElementWithRtp : public basic::PipeElement {
     public:
-        explicit VideoCaptureElementWithRtp(std::string &chanPubID, int fps, int streamTransType, int gpuIdx = -1);
+        explicit VideoCaptureElementWithRtp(std::string &chanPubID, int fps, int streamTransType, int gpuIdx = -1,
+                                            RtspAnalysManager *manager = nullptr);
 
         virtual ~VideoCaptureElementWithRtp();
 
diff --git a/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp b/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
index 679aaf6..a8aa27e 100644
--- a/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
+++ b/QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
@@ -123,6 +123,9 @@
                     strImgUrl = strImgUrlTmp;
 //                    strImgUrl.append("/").append(strImgUrlTmp);
                     fdfsClient->rwLock.unlock();
+                } else {
+                    strImgUrl = "";
+                    ERR("fdfsClient is nullptr ???");
                 }
 
                 //鎷兼帴json
diff --git a/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp b/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp
index efb8645..db552a4 100644
--- a/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp
+++ b/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp
@@ -10,24 +10,24 @@
 
 //RtspAnalysElement::RtspAnalysElement() {}
 
-//std::string RtspAnalysElement::resetFdfs(std::string ip, unsigned int port, std::string content) {
-//
-//    std::thread reset([&]() {
-//        fdfsClient.rwLock.rdlock();
-//        if (fdfsClient.fastFds != nullptr) {
-//            delete fdfsClient.fastFds;
-//        }
-//        fdfsClient.fastFds = new FastFds("fastDfsClient.conf");
-//        fdfsClient.rwLock.unlock();
-//    });
-//    reset.detach();
-//
-//    return "";
-//}
+std::string RtspAnalysElement::resetFdfs(std::string ip, unsigned int port, std::string content) {
+
+    std::thread reset([&]() {
+        fdfsClient.rwLock.rdlock();
+        if (fdfsClient.fastFds != nullptr) {
+            delete fdfsClient.fastFds;
+        }
+        fdfsClient.fastFds = new FastFds("fastDfsClient.conf");
+        fdfsClient.rwLock.unlock();
+    });
+    reset.detach();
+
+    return "";
+}
 
 RtspAnalysElement::RtspAnalysElement(LDBTool *_dbTool) : m_lDBTool(_dbTool), maxCount(50), currentCount(0) {
     init();
-//    resetFdfs();
+    resetFdfs();
     {
 //        std::thread httpServer([&]() {
 //            //#todo port
diff --git a/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.h b/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.h
index d943d1c..01d9abd 100644
--- a/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.h
+++ b/QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.h
@@ -21,7 +21,7 @@
 
     virtual ~RtspAnalysElement();
 
-    int addCamera(const std::string &, const std::map<int, SdkRule>& sdkRuleMap);
+    int addCamera(const std::string &, const std::map<int, SdkRule> &sdkRuleMap);
 
     int removeCamera(const std::string &);
 
@@ -36,7 +36,7 @@
 private:
     void init();
 
-//    std::string resetFdfs(std::string ip = "", unsigned int port = 0, std::string content = "");
+    std::string resetFdfs(std::string ip = "", unsigned int port = 0, std::string content = "");
 
     static std::vector<int> chnString2Vec(std::string str_list);
 
diff --git a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
index 60dc82e..7c814eb 100644
--- a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
+++ b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
@@ -40,47 +40,69 @@
 //鍒濆鍖栧嚱鏁�
 void RtspAnalysManager::init() {
     INFO("MYH DEBUG HERE")
+
+    m_GB28181_Enable = appPref.getIntData("GB28181_Enable");
     //#todo GB28181
-#ifndef GB28181
-    auto lst = m_lDBTool->searchCamDevTableAll();
-    Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
+    if (m_GB28181_Enable) {
+        auto lst = m_lDBTool->searchCamDevTableByType(1);
+        Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
 
-    //璁剧疆瑙嗛鐨勬渶闀垮拰鏈�鐭椂闂撮棿闅�
-    appPref.setIntData("n_cut_max_duration", lst_dev.n_cut_max_duration);
-    appPref.setIntData("n_cut_min_duration", lst_dev.n_cut_min_duration);
-    if (lst.size() > 0) {
-        int startCamNO = appPref.getIntData("CamStart") * appPref.getIntData("CamStep");
-        int CamCount = appPref.getIntData("CamStep");
-        INFO("StartCamNO: " << startCamNO << " CamStep: " << CamCount);
-        auto itor = lst.begin();
-
-        if (startCamNO >= lst.size()) {
-            ERR("startCamNO > lst.size()");
-            return;
+        //璁剧疆瑙嗛鐨勬渶闀垮拰鏈�鐭椂闂撮棿闅�
+        appPref.setIntData("n_cut_max_duration", lst_dev.n_cut_max_duration);
+        appPref.setIntData("n_cut_min_duration", lst_dev.n_cut_min_duration);
+        if (lst.size() > 0) {
+            for (auto item : lst) {
+                std::string t_camIdex = item.str_cam_dev_id.toStdString();
+                std::string rtsp_url = "GB28181";
+//            rtspAddrBuild(item.str_ip.toStdString(), 554, item.str_username.toStdString(),
+//                                                 item.str_password.toStdString(), item.str_brand.toStdString());
+                INFO("cam add is " << item.str_addr.toStdString());
+                addCamera(t_camIdex, rtsp_url);
+            }
+        } else {
+            ERR("searchCamDevTableAll size is 0");
         }
 
-        for (int i = 0; i < startCamNO; i++) {
+    } else {
+        auto lst = m_lDBTool->searchCamDevTableAll();
+        Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
 
-            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);
-            itor++;
-        }
+        //璁剧疆瑙嗛鐨勬渶闀垮拰鏈�鐭椂闂撮棿闅�
+        appPref.setIntData("n_cut_max_duration", lst_dev.n_cut_max_duration);
+        appPref.setIntData("n_cut_min_duration", lst_dev.n_cut_min_duration);
+        if (lst.size() > 0) {
+            int startCamNO = appPref.getIntData("CamStart") * appPref.getIntData("CamStep");
+            int CamCount = appPref.getIntData("CamStep");
+            INFO("StartCamNO: " << startCamNO << " CamStep: " << CamCount);
+            auto itor = lst.begin();
 
-        for (int i = 0; i < CamCount; i++) {
-            if (itor == lst.end()) {
-                ERR("itor == lst.end()");
+            if (startCamNO >= lst.size()) {
+                ERR("startCamNO > lst.size()");
                 return;
             }
-            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("cam add is " << itor->str_addr.toStdString());
 
-            addCamera(t_camIdex, rtsp_url);
-            itor++;
-        }
+            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);
+                itor++;
+            }
+
+            for (int i = 0; i < CamCount; i++) {
+                if (itor == lst.end()) {
+                    ERR("itor == lst.end()");
+                    return;
+                }
+                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("cam add is " << itor->str_addr.toStdString());
+
+                addCamera(t_camIdex, rtsp_url);
+                itor++;
+            }
 
 //        for (auto item : lst)
 //        {
@@ -92,65 +114,10 @@
 //            addCamera(t_camIdex, rtsp_url);
 //
 //        }
-    } else {
-        ERR("searchCamDevTableAll size is 0");
-    }
-#else
-    auto lst = m_lDBTool->searchCamDevTableByType(1);
-    Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
-
-    //璁剧疆瑙嗛鐨勬渶闀垮拰鏈�鐭椂闂撮棿闅�
-    appPref.setIntData("n_cut_max_duration", lst_dev.n_cut_max_duration);
-    appPref.setIntData("n_cut_min_duration", lst_dev.n_cut_min_duration);
-    if (lst.size() > 0) {
-//        int startCamNO = appPref.getIntData("CamStart") * appPref.getIntData("CamStep");
-//        int CamCount = appPref.getIntData("CamStep");
-//        INFO("StartCamNO: " << startCamNO << " CamStep: " << CamCount);
-//        auto itor = lst.begin();
-//
-//        if (startCamNO >= lst.size()) {
-//            ERR("startCamNO > lst.size()");
-//            return;
-//        }
-//        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);
-//            itor++;
-//        }
-//
-//        for (int i = 0; i < CamCount; i++) {
-//            if (itor == lst.end()) {
-//                ERR("itor == lst.end()");
-//                return;
-//            }
-//            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("cam add is " << itor->str_addr.toStdString());
-//
-//            addCamera(t_camIdex, rtsp_url);
-//            itor++;
-//        }
-
-        for (auto item : lst) {
-            std::string t_camIdex = item.str_cam_dev_id.toStdString();
-            std::string rtsp_url = "GB28181";
-//            rtspAddrBuild(item.str_ip.toStdString(), 554, item.str_username.toStdString(),
-//                                                 item.str_password.toStdString(), item.str_brand.toStdString());
-            INFO("cam add is " << item.str_addr.toStdString());
-
-            addCamera(t_camIdex, rtsp_url);
-
+        } else {
+            ERR("searchCamDevTableAll size is 0");
         }
-    } else {
-        ERR("searchCamDevTableAll size is 0");
     }
-
-
-#endif
 }
 
 RtspAnalysManager::~RtspAnalysManager() {
@@ -160,6 +127,11 @@
         delete controller.second;
     }
     m_controllers.clear();
+    for (auto controller: m_controllers_videoCapElem) {
+        INFO("Delete Controller: " << controller.first);
+        delete controller.second;
+    }
+    m_controllers_videoCapElem.clear();
 }
 
 /**
@@ -171,9 +143,46 @@
  * @return -1 娣诲姞澶辫触,0 娣诲姞鎴愬姛
  */
 int RtspAnalysManager::addCamera(const std::string &index, const std::string &rtsp) {
-#ifndef GB28181
-    //    why search lst ?
-    //    auto lst = m_lDBTool->searchCamDevTableAll();
+
+    if (m_GB28181_Enable) {
+        //#todo
+//    why search lst ?
+//    auto lst = m_lDBTool->searchCamDevTableAll();
+        Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
+
+        //#todo end
+        if (m_controllers_videoCapElem.find(index) == m_controllers_videoCapElem.end()) {
+            INFO("MYH DEBUG HERE");
+            if (m_currentCount >= m_maxCount) {
+                ERR("addCamera faild, camera's num is full!")
+                return -1;
+            }
+            INFO("RTSP: " << rtsp << "  INDEX:" << index);
+
+            m_imgRedisCRwLock.wrlock();
+            m_imgRedisControllers[index] = new RtspImageRedisElement(index);
+            m_imgRedisControllers[index]->start();
+            m_imgRedisCRwLock.unlock();
+
+            //VideoCaptureElementWithRtp(std::string &chanPubID, int fps, int streamTransType, int gpuIdx = -1)
+            m_controllers_videoCapElem[index] = new BASICGB28181::VideoCaptureElementWithRtp(
+                const_cast<string &>(index),
+                25, 0, 0, this);
+            m_controllers_videoCapElem[index]->SetVideoMinMaxSeconds(lst_dev.n_cut_min_duration,
+                                                                     lst_dev.n_cut_max_duration);
+            m_controllers_videoCapElem[index]->start();
+            m_currentCount++;
+            return 0;
+
+        } else {
+            removeCamera(index);
+            INFO("removeCamera " << index);
+            //DBG("removeCamera " << index);
+            return addCamera(index, rtsp);
+        }
+    } else {
+        //    why search lst ?
+        //    auto lst = m_lDBTool->searchCamDevTableAll();
         Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
         if (m_controllers.find(index) == m_controllers.end()) {
             INFO("MYH DEBUG HERE");
@@ -197,38 +206,12 @@
             //DBG("removeCamera " << index);
             return addCamera(index, rtsp);
         }
-#else
-    //#todo
-//    why search lst ?
-//    auto lst = m_lDBTool->searchCamDevTableAll();
-    Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
-
-    //#todo end
-    if (m_controllers_videoCapElem.find(index) == m_controllers_videoCapElem.end()) {
-        INFO("MYH DEBUG HERE");
-        if (m_currentCount >= m_maxCount) {
-            ERR("addCamera faild, camera's num is full!")
-            return -1;
-        }
-        INFO("RTSP: " << rtsp << "  INDEX:" << index);
-        m_imgRedisControllers[index] = new RtspImageRedisElement(index);
-        m_imgRedisControllers[index]->start();
-
-        //VideoCaptureElementWithRtp(std::string &chanPubID, int fps, int streamTransType, int gpuIdx = -1)
-        m_controllers_videoCapElem[index] = new BASICGB28181::VideoCaptureElementWithRtp(const_cast<string &>(index),
-                                                                                         25, 1, 0);
-        m_controllers_videoCapElem[index]->SetVideoMinMaxSeconds(lst_dev.n_cut_min_duration,
-                                                                 lst_dev.n_cut_max_duration);
-        m_controllers_videoCapElem[index]->start();
-        m_currentCount++;
-        return 0;
-
-    } else {
-        removeCamera(index);
-        INFO("removeCamera " << index);
-        //DBG("removeCamera " << index);
-        return addCamera(index, rtsp);
     }
+
+#ifndef GB28181
+
+#else
+
 #endif
 }
 
@@ -258,11 +241,13 @@
     m_currentCount--;
 #endif
 
+    m_imgRedisCRwLock.wrlock();
     auto imgRedis = m_imgRedisControllers[index];
     imgRedis->stop();
     imgRedis->wait();
     delete imgRedis;
     m_imgRedisControllers.erase(index);
+    m_imgRedisCRwLock.unlock();
     INFO("MYH DEBUG HERE");
     return 0;
 }
@@ -294,6 +279,7 @@
 #endif
     INFO("MYH DEBUG HERE");
 
+    m_imgRedisCRwLock.wrlock();
     for (auto controller: m_imgRedisControllers) {
         controller.second->stop();
     }
@@ -302,6 +288,7 @@
         delete controller.second;
     }
     m_imgRedisControllers.clear();
+    m_imgRedisCRwLock.unlock();
 
 
     m_currentCount = 0;
@@ -319,17 +306,26 @@
     return m_currentCount;
 }
 
-
 //褰曞彇瑙嗛鐨凴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()) {
-        auto pCaptureElem = m_controllers.find(nameSt.m_camId);
-        if (pCaptureElem != m_controllers.end()) {
-            pCaptureElem->second->SaveVideo(name);
+        if (GB28181_Enable) {
+            auto pCaptureElem = m_controllers_videoCapElem.find(nameSt.m_camId);
+            if (pCaptureElem != m_controllers_videoCapElem.end()) {
+//#todo ~~~~~~!!!!!!! 杩欓噷鏈塨ug 闇�瑕佹斁寮�璋冭瘯
+//            pCaptureElem->second->SaveVideo(name);
+            } else {
+                ERR("Can not Find CamId " << nameSt.m_camId);
+            }
         } else {
-            ERR("Can not Find CamId " << nameSt.m_camId);
+            auto pCaptureElem = m_controllers.find(nameSt.m_camId);
+            if (pCaptureElem != m_controllers.end()) {
+                pCaptureElem->second->SaveVideo(name);
+            } else {
+                ERR("Can not Find CamId " << nameSt.m_camId);
+            }
         }
     } else {
         ERR("Record Video Failed:Name Not Valid  Name:  " << name);
@@ -339,7 +335,9 @@
 
 //淇濆瓨瑙嗛鍒癛tspImageRedis鐨勯槦鍒�,鐢盧tspCaptureElement璋冪敤
 bool RtspAnalysManager::SaveImageToRedis(const std::string &camId, const std::string &imageName, const cv::Mat &img) {
-    INFO("MYH DEBUG HERE");
+    INFO("MYH DEBUG HERE  " << camId);
+
+//    m_imgRedisCRwLock.rdlock();
     auto item = m_imgRedisControllers.find(camId);
     if (item != m_imgRedisControllers.end()) {
         INFO("Save Succeed Cam: " << camId << " ImageKey: " << imageName);
@@ -347,6 +345,7 @@
     } else {
         ERR("Save Failed Cam: " << camId << " ImageKey: " << imageName);
     }
+//    m_imgRedisCRwLock.unlock();
     INFO("MYH DEBUG HERE");
     return true;
 }
diff --git a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.h b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.h
index 8f15623..d608547 100644
--- a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.h
+++ b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.h
@@ -53,8 +53,12 @@
 
 private:
 
+    RWLock m_imgRedisCRwLock;
+
     LDBTool *m_lDBTool;
 
+    int m_GB28181_Enable;
+
     //淇濆瓨CamID鍜孯tspCaptureElement鐨勬槧灏勫叧绯�
     std::map<std::string, RtspCaptureElement *> m_controllers;
 
diff --git a/QiaoJiaSystem/VideoToImageMulth/main.cpp b/QiaoJiaSystem/VideoToImageMulth/main.cpp
index 0a29848..fbc65f7 100644
--- a/QiaoJiaSystem/VideoToImageMulth/main.cpp
+++ b/QiaoJiaSystem/VideoToImageMulth/main.cpp
@@ -45,6 +45,12 @@
     return std::move(str_ip);
 }
 
+/***
+ * arg1 涓�-1鏃跺惎鐢╣b28181
+ * @param argc
+ * @param argv
+ * @return
+ */
 int main(int argc, char **argv) {
     std::cout << __DATE__ << " " << __TIME__ << std::endl;
     SAVE_APP_ARGS
@@ -53,77 +59,87 @@
     ENABLEGLOG(GET_STR_CONFIG("logPath").c_str());
 #endif
 
-    int gindx = atoi(argv[1]) % 2;
+    if (argc < 4) {
+        assert("t_value.size()");
+    }
+
+    int arg1 = atoi(argv[1]);
+
+    int gindx = abs(arg1) % 2;
+    int GB28181_Enable = abs(arg1) % 2;
     DBG(gindx);
+    appPref.setIntData("GB28181_Enable", GB28181_Enable);
     appPref.setLongData("gpu.index", gindx);
     appPref.setIntData("show.image", 0);
 
     //todo
-    appPref.setIntData("CamStart", atoi(argv[1]));
+    appPref.setIntData("CamStart", arg1);
     appPref.setIntData("CamStep", atoi(argv[2]));
     appPref.setIntData("RpcServerPort", atoi(argv[3]));
+    if (GB28181_Enable) {
+        //#todo search from db
+        MysqlDBServerCfg mysqlDBServerCfg;
+        mysqlDBServerCfg.Host = getLocalIp();
+        mysqlDBServerCfg.Port = 3306;
+        mysqlDBServerCfg.UserName = "root";
+        mysqlDBServerCfg.Passwd = "123456";
+        mysqlDBServerCfg.DBName = "EGEyesForVSS";
+        mysqlDBServerCfg.DBConnCount = 5;
 
-    //#todo search from db
-    MysqlDBServerCfg mysqlDBServerCfg;
-    mysqlDBServerCfg.Host = getLocalIp();
-    mysqlDBServerCfg.Port = 3306;
-    mysqlDBServerCfg.UserName = "root";
-    mysqlDBServerCfg.Passwd = "123456";
-    mysqlDBServerCfg.DBName = "EGEyesForVSS";
-    mysqlDBServerCfg.DBConnCount = 5;
-
-    LDBTool ldbTool;
-    BaseSqliteDao::setLDBTool(&ldbTool);
-
-    //#todo search from db
-    Json::Value t_value;
-    {
         LDBTool ldbTool;
         BaseSqliteDao::setLDBTool(&ldbTool);
-        t_value = VssLocalSettingTblSqliteDao::instance()->findAllVssLocalSettingTblList();
-    }
-    if (t_value.size() == 1 && t_value["data"].size() > 1) {
-        assert("t_value.size()");
-    }
-    DBG(t_value["data"].begin()->toStyledString());
-    auto &t_cfg = *t_value["data"].begin();
-    GBServerCfg gbServerCfg;
-    gbServerCfg.SvrIp = t_cfg["ServerIp"].asString(); // 鍥芥爣鏈嶅姟鐨刬p鍦板潃  (鏈満鐨刬p鍦板潃)
-    gbServerCfg.SvrPort = atoi(t_cfg["ServerPort"].asString().c_str());// 7060; // 鍥芥爣鏈嶅姟鐩戝惉鐨勭鍙�
-    gbServerCfg.SvrPubID = t_cfg["ServerId"].asString();// "44120000002000000001"; // 鍥芥爣鏈嶅姟鍣ㄧ殑ID
-    gbServerCfg.bMD5Auth = false; // 鏄惁闇�瑕丮D5鍔犲瘑
-    gbServerCfg.UserName = t_cfg["UserAuthId"].asString();// "44120100002000000002"; // 鍥芥爣鏈嶅姟鐨勭敤鎴峰悕	(涓嬬骇璁惧娉ㄥ唽鐨勭敤鎴峰悕)
-    gbServerCfg.Passwd = t_cfg["Password"].asString();// "123456"; // 鍥芥爣鏈嶅姟鐨勫瘑鐮�	(涓嬬骇璁惧娉ㄥ唽鐨勫瘑鐮�)
-    gbServerCfg.SubScribeTime = 3600; // 璁㈤槄鏃堕棿  濡傛灉涓�0 琛ㄧず涓嶈闃�
 
-    SpinLock spinLock;
-
-    bool running = false;
-    bool serinit = false;
-    auto func = [&] {
-        spinLock.lock();
-        GB28181Server m_gbs;
-        m_gbs.setMysqlConnParam(mysqlDBServerCfg);
-        m_gbs.setGBServerParam(gbServerCfg);
-        DBG("initServer start before");
-        running = m_gbs.initServer();
-        DBG("initServer start after");
-
-        spinLock.unlock();
-        while (running) {
-            usleep(4000);
+        //#todo search from db
+        Json::Value t_value;
+        {
+            LDBTool ldbTool;
+            BaseSqliteDao::setLDBTool(&ldbTool);
+            t_value = VssLocalSettingTblSqliteDao::instance()->findAllVssLocalSettingTblList();
         }
+        if (t_value.size() == 1 && t_value["data"].size() > 1) {
+            assert("t_value.size()");
+        }
+        DBG(t_value["data"].begin()->toStyledString());
+        auto &t_cfg = *t_value["data"].begin();
+        GBServerCfg gbServerCfg;
+        gbServerCfg.SvrIp = t_cfg["ServerIp"].asString(); // 鍥芥爣鏈嶅姟鐨刬p鍦板潃  (鏈満鐨刬p鍦板潃)
+        gbServerCfg.SvrPort = atoi(t_cfg["ServerPort"].asString().c_str());// 7060; // 鍥芥爣鏈嶅姟鐩戝惉鐨勭鍙�
+        gbServerCfg.SvrPubID = t_cfg["ServerId"].asString();// "44120000002000000001"; // 鍥芥爣鏈嶅姟鍣ㄧ殑ID
+        gbServerCfg.bMD5Auth = false; // 鏄惁闇�瑕丮D5鍔犲瘑
+        gbServerCfg.UserName = t_cfg["UserAuthId"].asString();// "44120100002000000002"; // 鍥芥爣鏈嶅姟鐨勭敤鎴峰悕	(涓嬬骇璁惧娉ㄥ唽鐨勭敤鎴峰悕)
+        gbServerCfg.Passwd = t_cfg["Password"].asString();// "123456"; // 鍥芥爣鏈嶅姟鐨勫瘑鐮�	(涓嬬骇璁惧娉ㄥ唽鐨勫瘑鐮�)
+        gbServerCfg.SubScribeTime = 3600; // 璁㈤槄鏃堕棿  濡傛灉涓�0 琛ㄧず涓嶈闃�
 
-    };
+        SpinLock spinLock;
 
-    std::thread thd(func);
+        bool running = false;
+        bool serinit = false;
+        auto func = [&] {
+            spinLock.lock();
+            GB28181Server m_gbs;
+            m_gbs.setMysqlConnParam(mysqlDBServerCfg);
+            m_gbs.setGBServerParam(gbServerCfg);
+            DBG("initServer start before");
+            running = true;
+            m_gbs.initServer();
+            DBG("initServer start after");
 
-    usleep(400);
-    //      ---------------------娴嬭瘯------------------------
-    spinLock.lock();
-    if (!running) {
-        ERR("running is false   <<   DB init error");
-        exit(0);
+            spinLock.unlock();
+            while (running) {
+                usleep(4000);
+            }
+        };
+
+        std::thread thd(func);
+        thd.detach();
+
+        usleep(400);
+        //      ---------------------娴嬭瘯------------------------
+        spinLock.lock();
+//    if (!running) {
+//        ERR("running is false   <<   DB init error");
+//        exit(0);
+//    }
     }
     DBG("test start");
 

--
Gitblit v1.8.0