From 25a151d517f60a76de91095abcbf32a395949825 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期二, 25 五月 2021 15:14:02 +0800
Subject: [PATCH] bug avoid gb28181 lib

---
 csrc/wrapper.cpp |   53 ++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp
index 4b6bd93..e743dcb 100644
--- a/csrc/wrapper.cpp
+++ b/csrc/wrapper.cpp
@@ -1,6 +1,7 @@
 #include "wrapper.hpp"
 
 #include <thread>
+#include <atomic>
 #include <unistd.h>
 #include <sys/time.h>
 
@@ -455,23 +456,45 @@
 
     int GetGb28181Pic(const char *rtspUrl, char *retData, int *retDataLen, const int tt){
         int ret = 0;
-        std::string fn = rtspUrl;
+        std::atomic_bool add_camera{false};
 
-        auto handle_gb28181 = new GB28181API;
-        if(handle_gb28181->addCamera(fn) == -1){
-            delete(handle_gb28181);
-            logIt("do addCamera Error\n");
-            return -1;
+        std::thread t([&]{
+            auto handle_gb28181 = new GB28181API;
+            std::string ru(rtspUrl);
+            if(handle_gb28181->addCamera(ru) == -1){
+                delete(handle_gb28181);
+                logIt("do addCamera Error\n");
+                ret = -2;
+                return;
+            }
+            add_camera.store(true);
+            std::this_thread::sleep_for(std::chrono::seconds(1));
+            int retLen = handle_gb28181->capturePic(handle_gb28181, retData, retDataLen, tt);
+            if(retLen == 0){
+                logIt("do capturePic failed:%d");
+                ret = -1;
+            }
+
+            handle_gb28181->deleteCamera();
+            delete handle_gb28181;
+        });
+
+        std::this_thread::sleep_for(std::chrono::seconds(1));
+
+        int ttt = tt;
+        if (ttt < 6) ttt = 6;
+
+        int i = -1;
+        while (true) {
+            std::this_thread::sleep_for(std::chrono::seconds(1));
+            if (add_camera.load()) {
+                t.join();
+                return ret;
+            }
+            if (i++ > ttt) break;
         }
-
-        int retLen = handle_gb28181->capturePic(handle_gb28181, retData, retDataLen, tt);
-        if(retLen == 0){
-            logIt("do capturePic failed:%d");
-            ret = -1;
-        }
-
-        handle_gb28181->deleteCamera();
-        return ret;
+        t.detach();
+        return -1;
     }
 }
 

--
Gitblit v1.8.0