From b3dd7bdf54aff8c85a36d9637258050e68820abd Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期三, 20 七月 2022 16:20:18 +0800 Subject: [PATCH] use gb tcp --- csrc/wrapper.cpp | 80 ++++++++++++++++++++++++++++++---------- 1 files changed, 60 insertions(+), 20 deletions(-) diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp index 4964629..d5d212b 100644 --- a/csrc/wrapper.cpp +++ b/csrc/wrapper.cpp @@ -1,6 +1,7 @@ #include "wrapper.hpp" #include <thread> +#include <atomic> #include <unistd.h> #include <sys/time.h> @@ -45,6 +46,7 @@ ,audio_(false) ,gb_(0) ,cpu_(0) + ,devid_(-1) ,run_dec_(false) ,run_stream_(true) ,run_rec_(false) @@ -66,6 +68,7 @@ ,audio_(false) ,gb_(0) ,cpu_(0) + ,devid_(-1) ,run_dec_(false) ,run_stream_(true) ,run_rec_(false) @@ -107,13 +110,16 @@ VideoProp prop; prop.url_ = input; prop.rtsp_tcp_ = true; - prop.gpu_acc_ = !cpu_; + prop.gpu_acc_ = false; + prop.gpu_index_ = devid_; - std::unique_ptr<FormatIn> in(new FormatIn(prop.gpuAccl())); + std::unique_ptr<FormatIn> in(new FormatIn(prop, prop.gpuAccl())); int flag = -1; +#ifdef GB28181 if (gb_){ flag = in->openGb28181(input, NULL); }else{ +#endif AVDictionary *avdic = prop.optsFormat(); if(avdic){ flag = in->open(input, &avdic); @@ -121,7 +127,9 @@ }else{ flag = in->open(input, NULL); } +#ifdef GB28181 } +#endif if(flag == 0){ if(!in->findStreamInfo(NULL)){ @@ -196,11 +204,19 @@ int64_t file_rebootime = 0; int64_t file_frame = 0; + using namespace std; + const string gb_suffix[] = {"/StreamType=2", "/StreamType=3", ""}; + const size_t gb_size = sizeof(gb_suffix) / sizeof(string); + int gs_idx = 0; + string url = input_url_; while(!stop_stream_.load()){ - auto in = init_reader(input_url_.c_str()); + if (gb_){ + url = input_url_ + gb_suffix[gs_idx]; + } + auto in = init_reader(url.c_str()); if (!in) { - logIt("ERROR: init_reader! url: %s\n", input_url_.c_str()); + logIt("ERROR: init_reader! url: %s\n", url.c_str()); sleep(2); continue; } @@ -450,25 +466,49 @@ return flag; } - int GetGb28181Pic(const char *rtspUrl, char *retData, int *retDataLen){ +#ifdef GB28181 + int GetGb28181Pic(const char *rtspUrl, char *retData, int *retDataLen, const int tt){ int ret = 0; - std::string fn = rtspUrl; + std::atomic_bool add_camera{false}; - auto handle_gb28181 = new GB28181API; - if(handle_gb28181->addCamera(fn) == -1){ - delete(handle_gb28181); - logIt("do addCamera Error\n"); - return -1; + std::thread t([&]{ + auto handle_gb28181 = new GB28181API; + std::string ru(rtspUrl); + if(handle_gb28181->addCamera(ru) == -1){ + delete(handle_gb28181); + logIt("do addCamera Error\n"); + ret = -2; + return; + } + add_camera.store(true); + std::this_thread::sleep_for(std::chrono::seconds(1)); + int retLen = handle_gb28181->capturePic(handle_gb28181, retData, retDataLen, tt); + if(retLen == 0){ + logIt("do capturePic failed:%d"); + ret = -1; + } + + handle_gb28181->deleteCamera(); + delete handle_gb28181; + }); + + std::this_thread::sleep_for(std::chrono::seconds(1)); + + int ttt = tt; + if (ttt < 6) ttt = 6; + + int i = -1; + while (true) { + std::this_thread::sleep_for(std::chrono::seconds(1)); + if (add_camera.load()) { + t.join(); + return ret; + } + if (i++ > ttt) break; } - - int retLen = handle_gb28181->capturePic(handle_gb28181, retData, retDataLen); - if(retLen == 0){ - logIt("do capturePic failed:%d"); - ret = -1; - } - - handle_gb28181->deleteCamera(); - return ret; + t.detach(); + return -1; } +#endif } -- Gitblit v1.8.0