From 5e85a7e80764e1a1eae39c8ce9bafed29d8773a9 Mon Sep 17 00:00:00 2001
From: chenshijun <csj_sky@126.com>
Date: 星期二, 23 七月 2019 19:57:27 +0800
Subject: [PATCH] 增加支持推流的代码,并替换librtspclient.so

---
 csrc/thirdparty/gb28181/include/PsToEs.hpp |  195 ++++++++++++++++++++++++------------------------
 1 files changed, 99 insertions(+), 96 deletions(-)

diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp
index 663fbdb..51f613a 100644
--- a/csrc/thirdparty/gb28181/include/PsToEs.hpp
+++ b/csrc/thirdparty/gb28181/include/PsToEs.hpp
@@ -67,7 +67,6 @@
 		while (!q.empty()) q.pop_front();
 		pthread_mutex_unlock(&mtx);
     }
-
 private:
     deque<T> q;
     pthread_mutex_t mtx;
@@ -80,111 +79,115 @@
 	int buffLen;
 } frameBuffInfo;
 
-MyQueue<frameBuffInfo *> m_rtpQueue;
-long Handle;
+class GB28181API{
+public:
+	GB28181API(/*string rtspUrl*/){
+//		handle = addCamera(rtspUrl);
+	}
 
-bool pushInfo(unsigned char *data, int datalen) {
+	~GB28181API(){
+		printf("GB28181API end!\n");
+		m_rtpQueue.clearAll();
+		deleteCamera();
+	}
 
-	frameBuffInfo *info = new frameBuffInfo();
-	info->buff = new unsigned char[datalen];
-	info->buffLen = datalen;
-	memcpy(info->buff, data, datalen);
-
-	//printf(" m_rtpQueue.push befores ");
-	m_rtpQueue.push(info);
-	//printf(" m_rtpQueue.push after ");
-
-	return true;
-}
-
-int readData(void *opaque, unsigned char *buf, int bufsize) {
-
-//	GB28181API *_this = (GB28181API *)opaque;
-	int len = bufsize;
-	int diff = 0;
-	do {
-
-	//printf(" m_rtpQueue.pop before ");
-	//浠庣紦瀛樹腑鑾峰彇buffinfo
-	frameBuffInfo *buffinfo = m_rtpQueue.pop();
-//        DBG(" m_rtpQueue.pop after ");
-	diff = len - buffinfo->buffLen;
-
-	//甯ч暱澶т簬bufsize
-	if (diff < 0) {
-		printf("/甯ч暱澶т簬bufsize:%d\n", diff);
-		memcpy(buf + bufsize - len, buffinfo->buff, len);
+	bool pushInfo(unsigned char *data, int datalen) {
 
 		frameBuffInfo *info = new frameBuffInfo();
-		info->buffLen = buffinfo->buffLen - len;
-		info->buff = new unsigned char[buffinfo->buffLen - len]{};
-		memcpy(info->buff, buffinfo->buff + len, buffinfo->buffLen - len);
+		info->buff = new unsigned char[datalen];
+		info->buffLen = datalen;
+		memcpy(info->buff, data, datalen);
 
-		m_rtpQueue.push_front_one(info);
-	} else if (diff == 0) {
-		printf("/甯ч暱绛変簬bufsize:%d\n", diff);
-		memcpy(buf + bufsize - len, buffinfo->buff, buffinfo->buffLen);
-	} else if (diff > 0) {
-		printf("/甯ч暱灏忎簬bufsize:%d\n", diff);
-		memcpy(buf + bufsize - len, buffinfo->buff, buffinfo->buffLen);
-		len = len - buffinfo->buffLen;   //杩橀渶瑕佸~鍏呯殑澶у皬
-		memset(buf + bufsize - len, 0, len);
-		//涓嶇瓑寰呭~鍏咃紝鐩存帴杩涜瑙g爜
-		diff = 0;
-	}
-	delete[] buffinfo->buff;
-	delete buffinfo;
-	} while (diff > 0);
+		//printf(" m_rtpQueue.push befores ");
+		m_rtpQueue.push(info);
+		//printf(" m_rtpQueue.push after ");
 
-	return bufsize;
-}
-
-void streamCallBack(int datatype, int frametype, unsigned char *data, unsigned int datalen, long userdata)
-{
-	//GB28181API *_this = (GB28181API *)userdata;
-	printf("userdata:%ld,datatype:%d, frametype:%d,  datalen:%d\n", userdata, datatype, frametype, datalen);
-
-//	//debug===============
-//	static int count = 0;
-//	static FILE *fp_write = NULL;
-//	if(count < 100) {
-//		count++;
-//
-//		if (!fp_write) {
-//			fp_write = fopen("stream_callback.mp4", "wb+");
-//		}
-//
-//		fwrite(data, sizeof(char), datalen, fp_write);
-//	}
-//	if(count >= 100){
-//		if (!fp_write) {
-//			fclose(fp_write);
-//		}
-//	}
-//	//debug===============
-
-	static bool startFlag = false;
-	if(frametype == GB_VIDEO_FRAME_I){
-		startFlag = true;
-	}
-	if((data != NULL) && (startFlag == true)){
-		pushInfo(data, datalen);
+		return true;
 	}
 
-}
+	static int readData(void *opaque, unsigned char *buf, int bufsize) {
 
-long addCamera(string &rtsp){
-	printf("RTSPSTREAM_Open\n");
-	long userdata = 1001;
-	Handle = RTSPSTREAM_Open(rtsp.c_str(), streamCallBack, userdata);
-	return Handle;
-}
+		GB28181API *_this = (GB28181API *)opaque;
+	    int len = bufsize;
+	    int diff = 0;
+	    do {
+//			printf(" m_rtpQueue.pop before \n");
+			//浠庣紦瀛樹腑鑾峰彇buffinfo
+			frameBuffInfo *buffinfo = _this->m_rtpQueue.pop();
+//			printf(" m_rtpQueue.pop after \n");
+			diff = len - buffinfo->buffLen;
 
-void deleteCamera(void){
-	m_rtpQueue.clearAll();
-	RTSPSTREAM_Close(Handle);
-	Handle = 0;
-}
+			//甯ч暱澶т簬bufsize
+			if (diff < 0) {
+//				printf("/甯ч暱澶т簬bufsize:%d\n", diff);
+				memcpy(buf + bufsize - len, buffinfo->buff, len);
 
+				frameBuffInfo *info = new frameBuffInfo();
+				info->buffLen = buffinfo->buffLen - len;
+				info->buff = new unsigned char[buffinfo->buffLen - len]{};
+				memcpy(info->buff, buffinfo->buff + len, buffinfo->buffLen - len);
+
+//				printf("/甯ч暱澶т簬info->buffLen:%d\n", info->buffLen);
+				_this->m_rtpQueue.push_front_one(info);
+//				printf("/甯ч暱澶т簬info->buffLen\n");
+			} else if (diff == 0) {
+//				printf("/甯ч暱绛変簬bufsize:%d\n", diff);
+				memcpy(buf + bufsize - len, buffinfo->buff, buffinfo->buffLen);
+			} else if (diff > 0) {
+//				printf("/甯ч暱灏忎簬bufsize:%d\n", diff);
+				memcpy(buf + bufsize - len, buffinfo->buff, buffinfo->buffLen);
+				len = len - buffinfo->buffLen;   //杩橀渶瑕佸~鍏呯殑澶у皬
+				memset(buf + bufsize - len, 0, len);
+				//涓嶇瓑寰呭~鍏咃紝鐩存帴杩涜瑙g爜
+				diff = 0;
+			}
+			delete[] buffinfo->buff;
+			delete buffinfo;
+//			printf("/甯ч暱澶т簬info->buffLen1\n");
+	    } while (diff > 0);
+
+	    return bufsize;
+	}
+
+	static void streamCallBack(int datatype, int frametype, unsigned char *data, unsigned int datalen, long userdata)
+	{
+		GB28181API *_this = (GB28181API *)userdata;
+		//printf("userdata:%ld,datatype:%d, frametype:%d,  datalen:%d\n", userdata, datatype, frametype, datalen);
+
+		/*static FILE* fp_write = NULL;
+		if (!fp_write)
+
+		{
+
+		    fp_write = fopen("stream_callback.mp4", "wb+");
+
+		}
+
+		fwrite(data, sizeof(char), datalen, fp_write);	*/
+
+		static bool startFlag = false;
+		if(frametype == GB_VIDEO_FRAME_I){
+			startFlag = true;
+		}
+		if((data != NULL) && (startFlag == true)){
+				_this->pushInfo(data, datalen);
+		}
+	}
+
+	void addCamera(string &rtsp){
+//		long userdata = 1001;//
+		printf("RTSPSTREAM_Open\n");
+		handle = RTSPSTREAM_Open(rtsp.c_str(), streamCallBack, (long)this);
+//		return handle;
+	}
+
+	void deleteCamera(){
+		printf("RTSPSTREAM_Close\n");
+		RTSPSTREAM_Close(handle);
+	}	
+private:
+	MyQueue<frameBuffInfo *> m_rtpQueue;
+	long handle;
+};
 
 

--
Gitblit v1.8.0