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