From ab3d17cd44625a762fc10f0f1fd8f2c46b980aff Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期二, 26 四月 2022 11:42:19 +0800
Subject: [PATCH] capture use cpu and add arm version

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

diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp
index 7a6278c..4128360 100644
--- a/csrc/thirdparty/gb28181/include/PsToEs.hpp
+++ b/csrc/thirdparty/gb28181/include/PsToEs.hpp
@@ -77,7 +77,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();
@@ -109,13 +110,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 +166,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");
@@ -191,7 +209,7 @@
             //浠庣紦瀛樹腑鑾峰彇buffinfo
             if (_this->m_rtpQueue.count_queue() == 0) {
 //                printf(" count_queue == 0 \n");
-                usleep(10000);
+                usleep(200000);
                 continue;
             }
 
@@ -210,6 +228,8 @@
             	if (!buffinfo){
             		buffinfo = _this->m_rtpQueue.pop();
             	}
+            	if (!buffinfo) continue;
+
             	auto fpIframe = fopen(fileIFrameName, "wb+");
             	fwrite(buffinfo->buff, buffinfo->buffLen, 1, fpIframe);
             	fflush(fpIframe);

--
Gitblit v1.8.0