From c5a01eed95f1837e93fee27bce4da78c79f4ed10 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期二, 12 十一月 2019 17:41:43 +0800
Subject: [PATCH] update

---
 csrc/thirdparty/gb28181/include/PsToEs.hpp |   35 +++++++++++++++++++++++++++++++----
 1 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp
index 2ac629d..30a1903 100644
--- a/csrc/thirdparty/gb28181/include/PsToEs.hpp
+++ b/csrc/thirdparty/gb28181/include/PsToEs.hpp
@@ -5,6 +5,7 @@
 #include <pthread.h>
 
 #include "librtsp.h"
+#include <sys/time.h>
 
 
 using namespace std;
@@ -14,7 +15,7 @@
 public:
     MyQueue():mtx(PTHREAD_MUTEX_INITIALIZER), cond(PTHREAD_COND_INITIALIZER){
         t.tv_sec = 0;
-        t.tv_nsec = 20000000;
+        t.tv_nsec = 0;
     }
 
     ~MyQueue() {
@@ -39,9 +40,16 @@
 
     T pop() {
         pthread_mutex_lock(&mtx);
-        while (q.empty()) {
-            pthread_cond_wait(&cond, &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);
+        }
+        if (q.empty()) {
+            pthread_mutex_unlock(&mtx);
+            return 0;
         }
         T value = q.front();
         q.pop_front();
@@ -67,11 +75,22 @@
 		while (!q.empty()) q.pop_front();
 		pthread_mutex_unlock(&mtx);
     }
+	
+	void clearAll(std::function<void(T)> fn){
+		pthread_mutex_lock(&mtx);
+		while (!q.empty()){
+			T value = q.front();
+			fn(value);
+			q.pop_front();
+		} 
+		pthread_mutex_unlock(&mtx);
+	}
 private:
     deque<T> q;
     pthread_mutex_t mtx;
     pthread_cond_t cond;
     timespec t;
+    struct timeval now;
 };
 
 typedef struct _buffInfo {
@@ -87,7 +106,11 @@
 
 	~GB28181API(){
 		printf("GB28181API end!\n");
-		m_rtpQueue.clearAll();
+		// m_rtpQueue.clearAll();
+		m_rtpQueue.clearAll([](frameBuffInfo *info){
+			delete[] info->buff;
+			delete info;
+		});
 		deleteCamera();
 	}
 
@@ -115,7 +138,11 @@
 			//浠庣紦瀛樹腑鑾峰彇buffinfo
 			frameBuffInfo *buffinfo = _this->m_rtpQueue.pop();
 //			printf(" m_rtpQueue.pop after \n");
+            if(buffinfo != nullptr){
 			diff = len - buffinfo->buffLen;
+            }else{
+                return 0;
+            }
 
 			//甯ч暱澶т簬bufsize
 			if (diff < 0) {

--
Gitblit v1.8.0