From 18a05d269516a5e33d8460291c2f93e73d95adce Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期二, 26 十二月 2023 10:45:31 +0800
Subject: [PATCH] GetYUV format is NV12

---
 csrc/thirdparty/gb28181/include/PsToEs.hpp |  191 +++++++++++++++++++++++++++--------------------
 1 files changed, 109 insertions(+), 82 deletions(-)

diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp
index d73d93c..54dc25f 100644
--- a/csrc/thirdparty/gb28181/include/PsToEs.hpp
+++ b/csrc/thirdparty/gb28181/include/PsToEs.hpp
@@ -43,16 +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;
+        struct timespec to;
+        clock_gettime(CLOCK_MONOTONIC, &to);
+        static uint64_t waitMS = 620; // wait
+        uint64_t sec = waitMS / 1000;
+        uint64_t nsec = (waitMS % 1000) * 1e6;
+        to.tv_sec = to.tv_sec + sec;
+        nsec += to.tv_nsec;
+        sec = nsec / 1000000000;
+        nsec = nsec % 1000000000;
+        to.tv_sec += sec;
+        to.tv_nsec = nsec;
 
         // printf("======>>wait stream data\n");
         pthread_mutex_lock(&mtx);
         while(q.empty()){
-            if(pthread_cond_timedwait(&cond, &mtx, &end) == ETIMEDOUT){
+            if(pthread_cond_timedwait(&cond, &mtx, &to) == ETIMEDOUT){
                 printf("======>>timeout quit\n");
                 break;
             }
@@ -109,8 +115,90 @@
 	int buffLen;
 } frameBuffInfo;
 
+typedef enum
+{
+    E_VIDEO_STREAM_NONE     = -1,
+    E_VIDEO_STREAM_H264     = 0,
+    E_VIDEO_STREAM_MPEG2    = 1,    // MPEG4
+    E_VIDEO_STREAM_MPEG4    = 2,    // MPEG4
+    E_VIDEO_STREAM_SVAC     = 3,    // SVAC
+    E_VIDEO_STREAM_3GP      = 4,    // 3GP
+    E_VIDEO_STREAM_H265     = 5,    //H265
+}VideoStreamType_E;
+
 class GB28181API{
 public:
+
+    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(200000);
+                continue;
+            }
+
+            frameBuffInfo *buffinfo = _this->m_rtpQueue.pop();
+            if (buffinfo == nullptr) {
+                printf(" buffinfo == nullptr \n");
+                return 0;
+            }
+////////////////////////////////////////////////////////
+            FILE* fpJpg = NULL;
+            char fileJpgName[32] = "./tmpCaptureJpg.jpg";
+            char fileIFrameName[32] = "./tmpCaptureX264IFrame";
+            char cmd[512] = {0};
+
+            for(int i = 0; i < 10 * 25; i++){
+                if (!buffinfo){
+                    buffinfo = _this->m_rtpQueue.pop();
+                }
+                if (!buffinfo) continue;
+
+                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);
+
+            memset(cmd, 0, 128);
+            sprintf(cmd, "rm %s %s >/dev/null", fileIFrameName, fileJpgName);
+            system(cmd);
+        } while (*bufsize == 0);
+
+        return *bufsize;
+    }
+
 	GB28181API(/*string rtspUrl*/){
 //		handle = addCamera(rtspUrl);
 	}
@@ -127,9 +215,10 @@
 		deleteCamera();
 	}
 
+    static const int keep_queue_count = 126;
 	bool pushInfo(unsigned char *data, int datalen) {
 
-		while(m_rtpQueue.count_queue() > 120){
+		while(m_rtpQueue.count_queue() > keep_queue_count){
             auto p = m_rtpQueue.popNotWait();
             if (p){
                 delete[] p->buff;
@@ -160,7 +249,7 @@
 			frameBuffInfo *buffinfo = _this->m_rtpQueue.pop();
 //			printf(" m_rtpQueue.pop after \n");
             if(buffinfo != nullptr){
-			diff = len - buffinfo->buffLen;
+			    diff = len - buffinfo->buffLen;
             }else{
                 return 0;
             }
@@ -175,7 +264,7 @@
 				info->buff = new unsigned char[buffinfo->buffLen - len]{};
 				memcpy(info->buff, buffinfo->buff + len, buffinfo->buffLen - len);
 
-				while(_this->m_rtpQueue.count_queue() > 120){
+				while(_this->m_rtpQueue.count_queue() > keep_queue_count){
                     auto p = _this->m_rtpQueue.popNotWait();
                     if (p){
                         delete[] p->buff;
@@ -204,76 +293,6 @@
 	    return 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(200000);
-                continue;
-            }
-
-            frameBuffInfo *buffinfo = _this->m_rtpQueue.pop();
-            if (buffinfo == nullptr) {
-                printf(" buffinfo == nullptr \n");
-                return 0;
-            }
-////////////////////////////////////////////////////////
-            FILE* fpJpg = NULL;
-          	char fileJpgName[32] = "./tmpCaptureJpg.jpg";
-            char fileIFrameName[32] = "./tmpCaptureX264IFrame";
-            char cmd[512] = {0};
-
-            for(int i = 0; i < 10 * 25; i++){
-            	if (!buffinfo){
-            		buffinfo = _this->m_rtpQueue.pop();
-            	}
-            	if (!buffinfo) continue;
-
-            	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);
-
-            memset(cmd, 0, 128);
-            sprintf(cmd, "rm %s %s >/dev/null", fileIFrameName, fileJpgName);
-            system(cmd);
-        } while (*bufsize == 0);
-
-        return *bufsize;
-    }
-
 	static void streamCallBack(int datatype, int frametype, unsigned char *data, unsigned int datalen, long userdata)
 	{
 		GB28181API *_this = (GB28181API *)userdata;
@@ -282,17 +301,23 @@
 		if(frametype == GB_VIDEO_FRAME_I){
 			startFlag = true;
 		}
+
+        // printf("streamCallBack recv data len %d frametype %d\n", datalen, startFlag);
+        if (_this->datatype_ < 0)
+            _this->datatype_ = datatype;
+
 		if((data != NULL) && (startFlag == true)){
-				_this->pushInfo(data, datalen);
+			_this->pushInfo(data, datalen);
 		}
 	}
 
 	long addCamera(string &rtsp){
         int count = 0;
-        while (handle == -1 && count <= 3) {
+        while (handle < 0 && count <= 3) {
             count ++;
             handle = RTSPSTREAM_Open(rtsp.c_str(), streamCallBack, (long) this);
             printf("RTSPSTREAM_Open, handle:%ld \n", handle);
+            usleep(20000);
         }
 		return handle;
 	}
@@ -304,8 +329,10 @@
 		}
 
 		handle = -1;
-	}	
+	}
+    const int getDataType(){return datatype_;}
 private:
+    int datatype_ = -1;
 	MyQueue<frameBuffInfo *> m_rtpQueue;
 	long handle = -1;
 };

--
Gitblit v1.8.0