From f346559ee07016172cab40b7fca5b2c5e09df899 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期四, 21 七月 2022 16:13:38 +0800 Subject: [PATCH] bug fixed --- csrc/thirdparty/gb28181/include/PsToEs.hpp | 116 +++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 79 insertions(+), 37 deletions(-) diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp index 438b06d..d73d93c 100644 --- a/csrc/thirdparty/gb28181/include/PsToEs.hpp +++ b/csrc/thirdparty/gb28181/include/PsToEs.hpp @@ -7,20 +7,23 @@ #include <unistd.h> #include "librtsp.h" #include <sys/time.h> - +#include <errno.h> using namespace std; template<typename T> class MyQueue { public: - MyQueue():mtx(PTHREAD_MUTEX_INITIALIZER), cond(PTHREAD_COND_INITIALIZER){ - t.tv_sec = 0; - t.tv_nsec = 0; + MyQueue():mtx(PTHREAD_MUTEX_INITIALIZER){ + pthread_condattr_t attr; + pthread_condattr_init(&attr); + pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); + pthread_cond_init(&cond, &attr); + pthread_condattr_destroy(&attr); } ~MyQueue() { - + pthread_cond_destroy(&cond); } public: @@ -40,14 +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; + + // printf("======>>wait stream data\n"); pthread_mutex_lock(&mtx); - if (q.empty()) { - gettimeofday(&now, NULL); - t.tv_sec = now.tv_sec + 3; - t.tv_nsec = now.tv_usec * 1000; -// pthread_cond_wait(&cond, &mtx); - pthread_cond_timedwait(&cond, &mtx, &t); + while(q.empty()){ + if(pthread_cond_timedwait(&cond, &mtx, &end) == ETIMEDOUT){ + printf("======>>timeout quit\n"); + break; + } } + // printf("======>>queue size %lu\n", q.size()); + if (q.empty()) { pthread_mutex_unlock(&mtx); return 0; @@ -77,7 +88,8 @@ pthread_mutex_unlock(&mtx); } - void clearAll(std::function<void(T)> fn){ + template<class F> + void clearAll(F&& fn){ pthread_mutex_lock(&mtx); while (!q.empty()){ T value = q.front(); @@ -90,8 +102,6 @@ deque<T> q; pthread_mutex_t mtx; pthread_cond_t cond; - timespec t; - struct timeval now; }; typedef struct _buffInfo { @@ -109,13 +119,23 @@ printf("GB28181API end!\n"); // m_rtpQueue.clearAll(); m_rtpQueue.clearAll([](frameBuffInfo *info){ - delete[] info->buff; - delete info; + if (info){ + delete[] info->buff; + delete info; + } }); deleteCamera(); } bool pushInfo(unsigned char *data, int datalen) { + + while(m_rtpQueue.count_queue() > 120){ + auto p = m_rtpQueue.popNotWait(); + if (p){ + delete[] p->buff; + delete p; + } + } frameBuffInfo *info = new frameBuffInfo(); info->buff = new unsigned char[datalen]; @@ -155,6 +175,13 @@ info->buff = new unsigned char[buffinfo->buffLen - len]{}; memcpy(info->buff, buffinfo->buff + len, buffinfo->buffLen - len); + while(_this->m_rtpQueue.count_queue() > 120){ + auto p = _this->m_rtpQueue.popNotWait(); + if (p){ + delete[] p->buff; + delete p; + } + } // printf("/甯ч暱澶т簬info->buffLen:%d\n", info->buffLen); _this->m_rtpQueue.push_front_one(info); // printf("/甯ч暱澶т簬info->buffLen\n"); @@ -177,17 +204,21 @@ return bufsize; } - static int capturePic(void *opaque, char *buf, int *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(10000); + usleep(200000); continue; } @@ -196,33 +227,44 @@ printf(" buffinfo == nullptr \n"); return 0; } - +//////////////////////////////////////////////////////// + FILE* fpJpg = NULL; + char fileJpgName[32] = "./tmpCaptureJpg.jpg"; char fileIFrameName[32] = "./tmpCaptureX264IFrame"; - auto fpIframe = fopen(fileIFrameName, "wb+"); - fwrite(buffinfo->buff, buffinfo->buffLen, 1, fpIframe); - fflush(fpIframe); - fclose(fpIframe); + char cmd[512] = {0}; - char cmd[128] = {0}; - memset(cmd, 0, 128); - char fileJpgName[32] = "./tmpCaptureJpg.jpg"; - sprintf(cmd, "ffmpeg -i %s -y -f image2 -ss 00:00:00 -vframes 1 %s >/dev/null", fileIFrameName, - fileJpgName); - system(cmd); + for(int i = 0; i < 10 * 25; i++){ + if (!buffinfo){ + buffinfo = _this->m_rtpQueue.pop(); + } + if (!buffinfo) continue; - auto fpJpg = fopen(fileJpgName, "rb"); - if (fpJpg == NULL) { - printf("fopen(fileJpgName, \"rb\")\n"); - return 0; + 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); - - delete[] buffinfo->buff; - delete buffinfo; memset(cmd, 0, 128); sprintf(cmd, "rm %s %s >/dev/null", fileIFrameName, fileJpgName); @@ -257,7 +299,7 @@ void deleteCamera(){ printf("RTSPSTREAM_Close\n"); - if(handle != -1){ + if(handle > -1){ RTSPSTREAM_Close(handle); } -- Gitblit v1.8.0