From f346559ee07016172cab40b7fca5b2c5e09df899 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期四, 21 七月 2022 16:13:38 +0800
Subject: [PATCH] bug fixed

---
 csrc/thirdparty/gb28181/include/PsToEs.hpp |  116 +++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 79 insertions(+), 37 deletions(-)

diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp
index 438b06d..d73d93c 100644
--- a/csrc/thirdparty/gb28181/include/PsToEs.hpp
+++ b/csrc/thirdparty/gb28181/include/PsToEs.hpp
@@ -7,20 +7,23 @@
 #include <unistd.h>
 #include "librtsp.h"
 #include <sys/time.h>
-
+#include <errno.h>
 
 using namespace std;
 
 template<typename T>
 class MyQueue {
 public:
-    MyQueue():mtx(PTHREAD_MUTEX_INITIALIZER), cond(PTHREAD_COND_INITIALIZER){
-        t.tv_sec = 0;
-        t.tv_nsec = 0;
+    MyQueue():mtx(PTHREAD_MUTEX_INITIALIZER){
+        pthread_condattr_t attr;
+        pthread_condattr_init(&attr);
+        pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
+        pthread_cond_init(&cond, &attr);
+        pthread_condattr_destroy(&attr);
     }
 
     ~MyQueue() {
-
+        pthread_cond_destroy(&cond);
     }
 
 public:
@@ -40,14 +43,22 @@
     }
 
     T pop() {
+        struct timespec now, end;
+        clock_gettime(CLOCK_MONOTONIC, &now);
+        static uint64_t waitS = 12; // wait
+        end.tv_sec = now.tv_sec + waitS;
+        end.tv_nsec = now.tv_nsec;
+
+        // printf("======>>wait stream data\n");
         pthread_mutex_lock(&mtx);
-        if (q.empty()) {
-            gettimeofday(&now, NULL);
-            t.tv_sec = now.tv_sec + 3;
-            t.tv_nsec = now.tv_usec * 1000;
-//            pthread_cond_wait(&cond, &mtx);
-            pthread_cond_timedwait(&cond, &mtx, &t);
+        while(q.empty()){
+            if(pthread_cond_timedwait(&cond, &mtx, &end) == ETIMEDOUT){
+                printf("======>>timeout quit\n");
+                break;
+            }
         }
+        // printf("======>>queue size %lu\n", q.size());
+
         if (q.empty()) {
             pthread_mutex_unlock(&mtx);
             return 0;
@@ -77,7 +88,8 @@
 		pthread_mutex_unlock(&mtx);
     }
 	
-	void clearAll(std::function<void(T)> fn){
+    template<class F>
+	void clearAll(F&& fn){
 		pthread_mutex_lock(&mtx);
 		while (!q.empty()){
 			T value = q.front();
@@ -90,8 +102,6 @@
     deque<T> q;
     pthread_mutex_t mtx;
     pthread_cond_t cond;
-    timespec t;
-    struct timeval now;
 };
 
 typedef struct _buffInfo {
@@ -109,13 +119,23 @@
 		printf("GB28181API end!\n");
 		// m_rtpQueue.clearAll();
 		m_rtpQueue.clearAll([](frameBuffInfo *info){
-			delete[] info->buff;
-			delete info;
+			if (info){
+				delete[] info->buff;
+				delete info;
+			}
 		});
 		deleteCamera();
 	}
 
 	bool pushInfo(unsigned char *data, int datalen) {
+
+		while(m_rtpQueue.count_queue() > 120){
+            auto p = m_rtpQueue.popNotWait();
+            if (p){
+                delete[] p->buff;
+                delete p;
+            }
+        }
 
 		frameBuffInfo *info = new frameBuffInfo();
 		info->buff = new unsigned char[datalen];
@@ -155,6 +175,13 @@
 				info->buff = new unsigned char[buffinfo->buffLen - len]{};
 				memcpy(info->buff, buffinfo->buff + len, buffinfo->buffLen - len);
 
+				while(_this->m_rtpQueue.count_queue() > 120){
+                    auto p = _this->m_rtpQueue.popNotWait();
+                    if (p){
+                        delete[] p->buff;
+                        delete p;
+                    }
+                }
 //				printf("/甯ч暱澶т簬info->buffLen:%d\n", info->buffLen);
 				_this->m_rtpQueue.push_front_one(info);
 //				printf("/甯ч暱澶т簬info->buffLen\n");
@@ -177,17 +204,21 @@
 	    return bufsize;
 	}
 
-    static int capturePic(void *opaque, char *buf, int *bufsize) {
+    static int capturePic(void *opaque, char *buf, int *bufsize, const int tt) {
 
         GB28181API *_this = (GB28181API *) opaque;
         int len = 0;
         *bufsize = 0;
 
+        int ttt = 0;
         do {
+        	if (ttt > tt) return 0;
+        	ttt++;
+
             //浠庣紦瀛樹腑鑾峰彇buffinfo
             if (_this->m_rtpQueue.count_queue() == 0) {
 //                printf(" count_queue == 0 \n");
-                usleep(10000);
+                usleep(200000);
                 continue;
             }
 
@@ -196,33 +227,44 @@
                 printf(" buffinfo == nullptr \n");
                 return 0;
             }
-
+////////////////////////////////////////////////////////
+            FILE* fpJpg = NULL;
+          	char fileJpgName[32] = "./tmpCaptureJpg.jpg";
             char fileIFrameName[32] = "./tmpCaptureX264IFrame";
-            auto fpIframe = fopen(fileIFrameName, "wb+");
-            fwrite(buffinfo->buff, buffinfo->buffLen, 1, fpIframe);
-            fflush(fpIframe);
-            fclose(fpIframe);
+            char cmd[512] = {0};
 
-            char cmd[128] = {0};
-            memset(cmd, 0, 128);
-            char fileJpgName[32] = "./tmpCaptureJpg.jpg";
-            sprintf(cmd, "ffmpeg -i %s -y -f image2 -ss 00:00:00 -vframes 1 %s >/dev/null", fileIFrameName,
-                    fileJpgName);
-            system(cmd);
+            for(int i = 0; i < 10 * 25; i++){
+            	if (!buffinfo){
+            		buffinfo = _this->m_rtpQueue.pop();
+            	}
+            	if (!buffinfo) continue;
 
-            auto fpJpg = fopen(fileJpgName, "rb");
-            if (fpJpg == NULL) {
-                printf("fopen(fileJpgName, \"rb\")\n");
-                return 0;
+            	auto fpIframe = fopen(fileIFrameName, "wb+");
+            	fwrite(buffinfo->buff, buffinfo->buffLen, 1, fpIframe);
+            	fflush(fpIframe);
+            	fclose(fpIframe);
+
+            	memset(cmd, 0, 512);
+            	sprintf(cmd, "ffmpeg -i %s -y -f image2 -ss 00:00:00 -vframes 1 %s >/dev/null", fileIFrameName,
+            	        fileJpgName);
+            	int rr = system(cmd);
+
+                delete[] buffinfo->buff;
+            	delete buffinfo;
+            	buffinfo = nullptr;
+
+            	fpJpg = fopen(fileJpgName, "rb");
+            	if (fpJpg) {
+            	    break;
+            	}
             }
+///////////////////////////////////////////////////////////
+
             fseek(fpJpg, 0, SEEK_END);
             len = ftell(fpJpg);
             fseek(fpJpg, 0, SEEK_SET);
             *bufsize = fread(buf, sizeof(char), len, fpJpg);
             fclose(fpJpg);
-
-            delete[] buffinfo->buff;
-            delete buffinfo;
 
             memset(cmd, 0, 128);
             sprintf(cmd, "rm %s %s >/dev/null", fileIFrameName, fileJpgName);
@@ -257,7 +299,7 @@
 
 	void deleteCamera(){
 		printf("RTSPSTREAM_Close\n");
-		if(handle != -1){
+		if(handle > -1){
 			RTSPSTREAM_Close(handle);
 		}
 

--
Gitblit v1.8.0