| | |
| | | while (!q.empty()) q.pop_front(); |
| | | pthread_mutex_unlock(&mtx); |
| | | } |
| | | |
| | | private: |
| | | deque<T> q; |
| | | pthread_mutex_t mtx; |
| | |
| | | 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); |
| | | //不等待填充,直接进行解码 |
| | | 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); |
| | | //不等待填充,直接进行解码 |
| | | 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; |
| | | }; |
| | | |
| | | |