From b73029149580370e62dd6c14a270aea902f85cf2 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期三, 18 九月 2019 09:52:30 +0800
Subject: [PATCH] fix rec bug
---
csrc/thirdparty/gb28181/include/PsToEs.hpp | 196 +++++++++++++++++++++++++------------------------
1 files changed, 100 insertions(+), 96 deletions(-)
diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp
index 663fbdb..a46f516 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,116 @@
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);
+ handle = -1;
+ }
+private:
+ MyQueue<frameBuffInfo *> m_rtpQueue;
+ long handle = -1;
+};
--
Gitblit v1.8.0