From ab3d17cd44625a762fc10f0f1fd8f2c46b980aff Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期二, 26 四月 2022 11:42:19 +0800 Subject: [PATCH] capture use cpu and add arm version --- csrc/wrapper.cpp | 117 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 84 insertions(+), 33 deletions(-) diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp index 5e50469..eec65a7 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) @@ -56,6 +58,7 @@ ,logit_(false) ,fps_(25) ,file_finished_(false) + ,min_duration_(0) { makeTheWorld(); } @@ -65,6 +68,7 @@ ,audio_(false) ,gb_(0) ,cpu_(0) + ,devid_(-1) ,run_dec_(false) ,run_stream_(true) ,run_rec_(false) @@ -76,6 +80,7 @@ ,logit_(true) ,fps_(25) ,file_finished_(false) + ,min_duration_(0) { makeTheWorld(); logif::CreateLogger(logfile, true); @@ -105,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); @@ -119,7 +127,9 @@ }else{ flag = in->open(input, NULL); } +#ifdef GB28181 } +#endif if(flag == 0){ if(!in->findStreamInfo(NULL)){ @@ -191,6 +201,9 @@ void Wrapper::run_stream_thread(){ + int64_t file_rebootime = 0; + int64_t file_frame = 0; + while(!stop_stream_.load()){ auto in = init_reader(input_url_.c_str()); @@ -217,7 +230,8 @@ bool exist = access(input_url_.c_str(), 0) == 0; if (exist){ - wTime <<= 1; + wTime += wTime/2; + file_rebootime++; } logIt("WAIT TIME PER FRAME: %d", wTime); @@ -232,6 +246,7 @@ if (in->notVideoAudio(&data->getAVPacket())){ continue; } + // 闈炲浗鏍囪烦杩囩涓�甯�,娴嬭瘯绗竴甯ф湁闂 if (!gb_ && id < 0){ id++; v_id++; a_id++; @@ -252,7 +267,9 @@ id++; //鏈湴鏂囦欢澶揩sleep涓�涓� - if (exist){ + if (exist && in->isVideoPkt(&data->getAVPacket())){ + // 璁板綍瑙g爜鐨勬枃浠舵湁澶氬皯甯� + file_frame++; usleep(wTime); } @@ -260,15 +277,27 @@ deinit_worker(); if (exist) { - logIt("local file exist"); + // 涓夋涓�甯ч兘娌¤В鍑烘潵锛岄��鍑� + if (file_frame == 0 && file_rebootime < 3){ + logIt("libcffmpeg.so-> run %lld time, current frames %lld", file_rebootime, file_frame); + continue; + } + // 鏈�灏忛渶瑕佽В鍑哄灏戝抚 + if (file_frame < min_duration_ * fps_){ + logIt("libcffmpeg.so-> run %lld time, current frames %lld, mind %d, fps: %d", + file_rebootime, file_frame, min_duration_, fps_); + continue; + } + logIt("libcffmpeg.so-> local file %s run %lld time, all frames %lld, mind %d, fps: %d", + input_url_.c_str(), file_rebootime, file_frame, min_duration_, fps_); file_finished_ = true; break; } } } - void Wrapper::SetRecMinCacheTime(const int mind){ - rec_->SetRecMinCacheTime(mind); + void Wrapper::SetRecMinCacheTime(const int mind, const int maxd){ + min_duration_ = mind; } void Wrapper::OpenRecorder(){ @@ -291,41 +320,39 @@ if (rec_->Loaded()){ rec_->FireRecSignal(sid, id); } + return 0; } - void Wrapper::GetInfoRecorder(std::string &recID, int &index, std::string &path){ + int Wrapper::GetInfoRecorder(std::string &recID, int &index, std::string &path){ if (rec_){ rec_->GetRecInfo(recID, index, path); } + return 0; } ////////decoder void Wrapper::OpenDecoder(){ run_dec_ = true; } - void Wrapper::GetPicDecoder(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id){ + int Wrapper::GetPicDecoder(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id){ if (file_finished_){ - *data = (unsigned char*)this; - *w = 1080; - *h = 720; - *format = 23; - *length = 12; - *id = -10802020; - return; + return -1; } if (decoder_){ decoder_->GetFrame(data, w, h, format, length, id); } + return 0; } void Wrapper::CloseStream(){ run_stream_ = false; } - void Wrapper::GetPacket(unsigned char **pktData, int *size, int *key){ + int Wrapper::GetPacket(unsigned char **pktData, int *size, int *key){ if (stream_){ stream_->GetPacket(pktData, size, key); } + return 0; } } // end class wrapper @@ -431,25 +458,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