From 91c3b892e976ecf33819c0c2664e4dfcfd88e434 Mon Sep 17 00:00:00 2001
From: chenshijun <csj_sky@126.com>
Date: 星期六, 30 三月 2019 17:45:59 +0800
Subject: [PATCH] 添加新版本的GB28181代码

---
 QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h             |    1 
 QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h   |    2 
 QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.h              |    3 +
 QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp |   29 +++++++++++---
 QiaoJiaSystem/GB28181DecoderModel/GB28181Server.h                |   15 ++++++-
 QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp           |   10 ++++-
 QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp            |    6 ++
 7 files changed, 53 insertions(+), 13 deletions(-)

diff --git a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
index 0cfd3b4..27a837d 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
+++ b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
@@ -32,7 +32,7 @@
               dst.data, dst.linesize);
     sws_freeContext(convert_ctx);
 
-    DBG("m.size is " << m.size());
+//    DBG("m.size is " << m.size());
 //    LOG_IF();
 
     return m;
@@ -197,6 +197,12 @@
                 vi = i;
                 break;
             }
+        }
+        if(vi == -1)//鏃犺棰戝寘
+        {
+            ERR("no video packet!!");
+            p_this->m_running = false;
+            continue;
         }
         p_this->stream = p_this->ic->streams[vi];
         p_this->video_st = p_this->stream;
@@ -446,7 +452,7 @@
             delete iter->m_packet.data;
             iter = m_packetsVec.erase(iter);
             while (!(iter->m_packet.flags & AV_PKT_FLAG_KEY)) {
-                INFO("DropFrame: " << iter->m_frameId);
+//                INFO("DropFrame: " << iter->m_frameId);
                 delete iter->m_packet.data;
                 iter = m_packetsVec.erase(iter);
             }
diff --git a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h
index cdfe87e..a7dbb3f 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h
+++ b/QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.h
@@ -37,6 +37,7 @@
 }
 
 #include <mutex>
+#include <basic/pipe/TimerElement.h>
 
 namespace BASICGB28181 {
 
diff --git a/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.h b/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.h
index ee5e6fd..515d716 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.h
+++ b/QiaoJiaSystem/GB28181DecoderModel/GB28181Server.h
@@ -17,6 +17,7 @@
 #include <stdlib.h>
 #include <time.h>
 #include <string.h>
+#include <VideoToImageMulth/RtspAnalysManager.h>
 #include "28181SDK.h"
 #include "SpinLock.hpp"
 
@@ -80,10 +81,20 @@
     //鎵撳嵃浜嬩欢鍥炶皟淇℃伅
     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) {
+        if (eventtype == EVENT_DEVICE_CATALOG) {
 //            GB28181Server::bGetLoaclRes = true;
-        } else if (eventtype == 1 && eventparam == 1) {
+        } else if (eventtype == EVENT_REGISTER_STATUS && eventparam == 1) {
             C_GetResource(NULL);
+        } else if (eventtype == EVENT_VIDEO_EXCEPTION){
+            if(gRtspAnalysManagerCamera) {
+                auto cameraHandlePtr = (RtspAnalysManager *) gRtspAnalysManagerCamera;
+                ERR("gRtspAnalysManagerCamera ADDR:" << gRtspAnalysManagerCamera);
+                string camID(data, datalen);
+                ERR("EVENT_VIDEO_EXCEPTION reopen camID:" << camID);
+                cameraHandlePtr->addCamera(camID, camID);
+            }else{
+                ERR("gRtspAnalysManagerCamera is nullptr");
+            }
         }
     }
 
diff --git a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
index b2acfc4..8859d91 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
+++ b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
@@ -111,14 +111,30 @@
                 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) {
-//                    if(p_this->m_fFmpegDecoderJPG.getRunning()) {
-                    usleep(300000);
-//                    }else{
-//                        p_this->m_running = false;
-//                        break;
-//                    }
+                    if(p_this->m_fFmpegDecoderJPG.getRunning()) {
+                        usleep(300000);
+                    } else {
+
+                        // 鏍规嵁reopenTime鍒ゆ柇鏄惁闇�瑕侀噸鍚�
+                        if (reopenTime < 0) {
+                            p_this->m_running = false;
+                            stop();
+                            INFO("grabFrame faild, element stopping");
+                        } else {
+                            //todo 涓氬姟姝婚攣
+                            usleep((6 - reopenTime--) * 1000000);
+                            INFO("grabFrame faild, try reopen video: ");
+
+                            //鍏抽棴ffmpeg瑙g爜妯″潡
+                            p_this->m_fFmpegDecoderJPG.stopThd();
+                            //鍚姩ffmpeg瑙g爜妯″潡
+                            p_this->m_fFmpegDecoderJPG.startThd(p_this->m_chanPubID, p_this->m_fps, p_this->m_gpuIdx);
+                            continue;
+                        }
+                    }
                 }
                 DBG("videoCaptureElementThd stop ...");
                 //鍋滄鐐规挱
@@ -187,6 +203,7 @@
             INFO("grabFrame faild, element stopping");
             return;
         } else {
+            //todo 涓氬姟姝婚攣
             usleep(reopenTime * 1000);
             INFO("grabFrame faild, try reopen video: ");
             startRtpStream(m_streamTransType);
diff --git a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
index 4722443..5f98e6a 100644
--- a/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
+++ b/QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
@@ -53,7 +53,7 @@
         std::string MakeDir(const std::string &timeStamp);
 
     private:
-        int reopenTime{1000};
+        int reopenTime{10};
         int m_gpuIdx;
         int m_fps;
         int m_streamTransType;
diff --git a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
index ce56ad8..961c0c5 100644
--- a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
+++ b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
@@ -7,10 +7,11 @@
 
 
 using std::string;
+void *gRtspAnalysManagerCamera = nullptr;
 
 RtspAnalysManager::RtspAnalysManager(LDBTool *_dbTool) : m_lDBTool(nullptr), m_maxCount(50), m_currentCount(0) {
 //    INFO("MYH DEBUG HERE");
-    m_lDBTool = new LDBTool;
+    m_lDBTool = _dbTool;
     init();
 
 }
@@ -41,6 +42,9 @@
 void RtspAnalysManager::init() {
 //    INFO("MYH DEBUG HERE")
 
+    gRtspAnalysManagerCamera = this;
+    DBG("gRtspAnalysManagerCamera ADDR:" << gRtspAnalysManagerCamera);
+
     m_GB28181_Enable = appPref.getIntData("GB28181_Enable");
     //#todo GB28181
     if (m_GB28181_Enable) {
diff --git a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.h b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.h
index fbd73ba..870c262 100644
--- a/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.h
+++ b/QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.h
@@ -19,7 +19,8 @@
 //#include <VideoToImageMulth/rpc/RtspAnalysServer.h>
 
 //using BASICGB28181::VideoCaptureElementWithRtp;
-
+//澶栭儴浣跨敤鐨勫叏灞�鎸囬拡
+extern void *gRtspAnalysManagerCamera;
 //鐢ㄦ潵瀹炵幇recordVideo鐨凴PC鐨勬帴鍙g被
 class RtspAnalysManager : public ::RtspAnalys::RtspAnalysServer {
 

--
Gitblit v1.8.0