From 291dbcd9331cd0df41addef74defa4654ee034fb Mon Sep 17 00:00:00 2001
From: chenshijun <csj_sky@126.com>
Date: 星期一, 22 四月 2019 15:59:20 +0800
Subject: [PATCH] 增加人员异常的参数处理

---
 QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp |  168 ++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 128 insertions(+), 40 deletions(-)

diff --git a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
index 77862e7..9aedc2d 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
+++ b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
@@ -5,19 +5,19 @@
 #include <opencv2/imgproc.hpp>
 #include <qt5/QtCore/QDateTime>
 #include <basic/util/app/AppPreference.hpp>
+#include <basic/util/app/AppConfig.h>
 #include "VideoCaptureElementWithRtp.h"
+#include <VideoToImageMulth/RtspAnalysManager.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) {
+                                                                     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");
@@ -36,8 +36,83 @@
 
 bool BASICGB28181::VideoCaptureElementWithRtp::startRtpStream(int streamTransType) {
 
+    if (!m_waitSignalrunning) {
+        DBG("std::thread waitSignalAndEmit create New!!");
+        //绛夊緟涓嬪眰ffmpeg灏唕tp鍖呰В鐮佹垚涓哄浘鐗囧悗瑙﹀彂淇″彿,鐒跺悗瑙﹀彂褰撳墠绫荤殑submit
+        std::thread waitSignalAndEmit([&](BASICGB28181::VideoCaptureElementWithRtp *p_this) {
+            p_this->m_waitSignal = true;
+            p_this->m_waitSignalrunning = 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
+                //            浠巉fmpeg瑙g爜绫讳腑鑾峰彇鍥剧墖
+                p_this->m_fFmpegDecoderJPG.getImage().copyTo(p_this->m_image);
+
+                {
+                    if (p_this->m_publishVideoRet) {
+                        if (p_this->videoPublishElement == nullptr) {
+                            string path = appConfig.getStringProperty("srsAddr") + "cam" + p_this->m_chanPubID + ".flv";
+                            cv::Size size_(appConfig.getIntProperty("pulish.width"), appConfig.getIntProperty("pulish.height"));
+                            int gupIdx = appPref.getIntData("gpu.index");
+                            DBG("videoPublishpath: "  << p_this->m_chanPubID << path << " h:" << size_.height);
+                            p_this->videoPublishElement = new ffmpeg::PipeVideoPublishElement(path, size_, "flv", 25, gupIdx);
+                            p_this->videoPublishElement->start();
+                        } else {
+                            if (!p_this->m_image.empty()) {
+                                p_this->videoPublishElement->setImage(p_this->m_image);
+                                p_this->videoPublishElement->submit();
+                            } else {
+                                ERR("m_image.empty()");
+                            }
+                        }
+                    } else {
+                        if (p_this->videoPublishElement != nullptr) {
+                            DBG("videoPublishElement->stop() :"  << p_this->m_chanPubID);
+                            p_this->videoPublishElement->stop();
+                            p_this->videoPublishElement->wait();
+                            delete p_this->videoPublishElement;
+                            p_this->videoPublishElement = nullptr;
+                        }else{
+//                            DBG("videoPublishElement null :" << p_this->m_chanPubID);
+                        }
+                    }
+                }
+
+                /****褰曞儚妯″潡浠g爜*****/
+                p_this->m_picCount++;
+                //鍑犲紶閫変竴寮犳斁鍏edis
+                if (p_this->m_picCount % m_nPicsPickOne != 0) {
+                    continue;
+                } else {
+                    p_this->m_picCount.store(0);
+                }
+
+                {
+                    cv::Mat copyMat;
+                    std::string imageName = p_this->m_fFmpegDecoderJPG.GetImageName();
+                    p_this->m_image.copyTo(copyMat);
+                    p_this->m_pManager->SaveImageToRedis(p_this->m_chanPubID, imageName, copyMat);
+                }
+
+                p_this->submit();
+            }
+            p_this->m_waitSignalrunning = false;
+            INFO("waitSignalAndEmit is exit...");
+        }, this);
+        waitSignalAndEmit.detach();
+    }
+
     TryCath(
     //--------------鍥芥爣璁惧鎴栧垯鍥芥爣涓嬬骇骞冲彴蹇呴』鏀寔GB28181-2016----------------------------------------------
+    //瑙g爜绾跨▼锛屽彂璧风偣鎾姹傦紝鍚姩ffmpeg瑙g爜妯″潡
         std::thread videoCaptureElementThd([&](VideoCaptureElementWithRtp *p_this, int streamType) {
             DBG("videoCaptureElementThd start...");
             StreamTransType_E etype;
@@ -62,23 +137,58 @@
             }
             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;
+                //鍚姩ffmpeg瑙g爜妯″潡
                 p_this->m_fFmpegDecoderJPG.startThd(p_this->m_chanPubID, p_this->m_fps, p_this->m_gpuIdx);
+                usleep(1000000);
+                //闃诲绾跨▼锛岀瓑寰呭閮ㄨЕ鍙戝叧闂偣鎾�
                 while (p_this->m_running) {
-                    usleep(300000);
+                    if (p_this->m_fFmpegDecoderJPG.getRunning()) {
+                        usleep(300000);
+                    } else {
+
+                        // 鏍规嵁reopenTime鍒ゆ柇鏄惁闇�瑕侀噸鍚�
+                        if (p_this->reopenTime < 0) {
+                            p_this->m_running = false;
+                            stop();
+                            INFO("grabFrame faild, element stopping");
+                        } else {
+                            //todo 涓氬姟姝婚攣
+                            usleep((6 - p_this->reopenTime--) * 1000000);
+                            INFO("grabFrame faild, try reopen video, reopenTime:" << p_this->reopenTime);
+
+                            //鍏抽棴ffmpeg瑙g爜妯″潡
+                            p_this->m_fFmpegDecoderJPG.stopThd();
+                            //鍚姩ffmpeg瑙g爜妯″潡
+                            DBG("m_chanPubID:"<<p_this->m_chanPubID << " m_fps:" << p_this->m_fps);
+                            p_this->m_fFmpegDecoderJPG.startThd(p_this->m_chanPubID, p_this->m_fps, p_this->m_gpuIdx);
+                            continue;
+                        }
+                    }
                 }
                 DBG("videoCaptureElementThd stop ...");
+                //鍋滄鐐规挱
                 C_RealVideoStop(lrealhandle);
+                //灏唚aitSignalAndEmit 绾跨▼閫�鍑�
+                p_this->m_waitSignal = false;
                 DBG("videoCaptureElementThd stop ok...");
             } else {
+                //鐐规挱澶辫触
+                p_this->m_waitSignal = false;
                 p_this->m_running = false;
+
+                //鍏抽棴ffmpeg瑙g爜妯″潡
                 p_this->m_fFmpegDecoderJPG.stopThd();
                 ERR(p_this->m_chanPubID << " C_RealVideoStart is error lrealhandle is  " << lrealhandle);
+
+                p_this->startRtpStream(p_this->m_streamTransType);
             }
 
         }, this, streamTransType);
@@ -119,48 +229,18 @@
 //        fwrite(data, sizeof(char), datalen, fp11);
     }
 #endif
-
+    //灏嗗簳灞傜粍濂界殑rtp鍖咃紝瀛樺叆ffmpeg涓殑缂撳瓨闃熷垪
     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);
 }
 
@@ -180,7 +260,7 @@
 
 void BASICGB28181::VideoCaptureElementWithRtp::SaveVideo(const std::string &strImageName) {
 
-    INFO("SaveVideo: " << strImageName);
+//    INFO("SaveVideo: " << strImageName);
     std::string strTimeStamp = AppUtil::getTimeUSecString();
     std::string strPath = MakeDir(strTimeStamp);
     m_fFmpegDecoderJPG.SaveVideoByImageName(strPath, strImageName);
@@ -208,3 +288,11 @@
 
     return t_FilePath;
 }
+
+void BASICGB28181::VideoCaptureElementWithRtp::startPublishVideo() {
+    m_publishVideoRet = true;
+}
+
+void BASICGB28181::VideoCaptureElementWithRtp::stopPublishVideo() {
+    m_publishVideoRet = false;
+}

--
Gitblit v1.8.0