From 65eb475b323b3b9c28761b4e3009ab3d269963e1 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期四, 22 十月 2020 11:13:50 +0800
Subject: [PATCH] h264 cuvid av bsf and rec
---
csrc/thirdparty/gb28181/include/PsToEs.hpp | 96 +++++++++++++++++++++++++++++++++++++++---------
1 files changed, 78 insertions(+), 18 deletions(-)
diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp
index 88eb4d9..438b06d 100644
--- a/csrc/thirdparty/gb28181/include/PsToEs.hpp
+++ b/csrc/thirdparty/gb28181/include/PsToEs.hpp
@@ -4,7 +4,9 @@
#include <deque>
#include <pthread.h>
+#include <unistd.h>
#include "librtsp.h"
+#include <sys/time.h>
using namespace std;
@@ -14,7 +16,7 @@
public:
MyQueue():mtx(PTHREAD_MUTEX_INITIALIZER), cond(PTHREAD_COND_INITIALIZER){
t.tv_sec = 0;
- t.tv_nsec = 20000000;
+ t.tv_nsec = 0;
}
~MyQueue() {
@@ -39,9 +41,16 @@
T pop() {
pthread_mutex_lock(&mtx);
- while (q.empty()) {
- pthread_cond_wait(&cond, &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);
+ }
+ if (q.empty()) {
+ pthread_mutex_unlock(&mtx);
+ return 0;
}
T value = q.front();
q.pop_front();
@@ -82,6 +91,7 @@
pthread_mutex_t mtx;
pthread_cond_t cond;
timespec t;
+ struct timeval now;
};
typedef struct _buffInfo {
@@ -129,7 +139,11 @@
//浠庣紦瀛樹腑鑾峰彇buffinfo
frameBuffInfo *buffinfo = _this->m_rtpQueue.pop();
// printf(" m_rtpQueue.pop after \n");
+ if(buffinfo != nullptr){
diff = len - buffinfo->buffLen;
+ }else{
+ return 0;
+ }
//甯ч暱澶т簬bufsize
if (diff < 0) {
@@ -163,21 +177,64 @@
return bufsize;
}
+ static int capturePic(void *opaque, char *buf, int *bufsize) {
+
+ GB28181API *_this = (GB28181API *) opaque;
+ int len = 0;
+ *bufsize = 0;
+
+ do {
+ //浠庣紦瀛樹腑鑾峰彇buffinfo
+ if (_this->m_rtpQueue.count_queue() == 0) {
+// printf(" count_queue == 0 \n");
+ usleep(10000);
+ continue;
+ }
+
+ frameBuffInfo *buffinfo = _this->m_rtpQueue.pop();
+ if (buffinfo == nullptr) {
+ printf(" buffinfo == nullptr \n");
+ return 0;
+ }
+
+ char fileIFrameName[32] = "./tmpCaptureX264IFrame";
+ auto fpIframe = fopen(fileIFrameName, "wb+");
+ fwrite(buffinfo->buff, buffinfo->buffLen, 1, fpIframe);
+ fflush(fpIframe);
+ fclose(fpIframe);
+
+ 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);
+
+ auto fpJpg = fopen(fileJpgName, "rb");
+ if (fpJpg == NULL) {
+ printf("fopen(fileJpgName, \"rb\")\n");
+ return 0;
+ }
+ 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);
+ system(cmd);
+ } while (*bufsize == 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){
@@ -189,9 +246,12 @@
}
long addCamera(string &rtsp){
-// long userdata = 1001;//
- handle = RTSPSTREAM_Open(rtsp.c_str(), streamCallBack, (long)this);
- printf("RTSPSTREAM_Open, handle:%ld \n", handle);
+ int count = 0;
+ while (handle == -1 && count <= 3) {
+ count ++;
+ handle = RTSPSTREAM_Open(rtsp.c_str(), streamCallBack, (long) this);
+ printf("RTSPSTREAM_Open, handle:%ld \n", handle);
+ }
return handle;
}
--
Gitblit v1.8.0