From f29f269d999fc4bb8a9bfa85629f08b89971a2ef Mon Sep 17 00:00:00 2001 From: chenshijun <csj_sky@126.com> Date: 星期二, 03 十二月 2019 16:00:49 +0800 Subject: [PATCH] Merge branch 'master' of ssh://192.168.5.5:29418/valib/goffmpeg --- csrc/wrapper.cpp | 152 +++++++++----------------------------------------- 1 files changed, 27 insertions(+), 125 deletions(-) diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp index a8e8f6c..1798683 100644 --- a/csrc/wrapper.cpp +++ b/csrc/wrapper.cpp @@ -46,6 +46,8 @@ ,gb_(0) ,cpu_(0) ,run_dec_(false) + ,run_stream_(true) + ,run_rec_(false) ,thread_(nullptr) ,stop_stream_(false) ,stream_(nullptr) @@ -63,6 +65,8 @@ ,gb_(0) ,cpu_(0) ,run_dec_(false) + ,run_stream_(true) + ,run_rec_(false) ,thread_(nullptr) ,stop_stream_(false) ,stream_(nullptr) @@ -166,9 +170,9 @@ p.pts = p.dts = AV_NOPTS_VALUE; } int flag = 0; - if (stream_) stream_->SetPacket(pkt); - if (decoder_ && run_dec_) flag = decoder_->SetFrame(pkt); - if (rec_->Loaded()) rec_->SetPacket(pkt); + if (run_stream_ && stream_) stream_->SetPacket(pkt); + if (run_dec_ && decoder_) flag = decoder_->SetFrame(pkt); + if (run_rec_ && rec_->Loaded()) rec_->SetPacket(pkt); return flag; } @@ -202,7 +206,7 @@ int64_t v_id = id; int64_t a_id = id; - bool exist = access(input_url_.c_str(), 0) == 0 ? true : false; + bool exist = access(input_url_.c_str(), 0) == 0; while(!stop_stream_.load()){ auto data(std::make_shared<CodedData>()); @@ -241,11 +245,16 @@ } deinit_worker(); + if (exist) break; } } void Wrapper::SetRecMinCacheTime(const int mind){ rec_->SetRecMinCacheTime(mind); + } + + void Wrapper::OpenRecorder(){ + run_rec_ = true; } void Wrapper::BuildRecorder(const char* id, const char *output, const int64_t &fid, const int mindur, const int maxdur, const bool audio){ @@ -260,7 +269,6 @@ [=]{rec_->NewRec(rid.c_str(), dir.c_str(), fid, mindur, maxdur, a);}; } } - int Wrapper::FireRecorder(const char* sid,const int64_t &id){ if (rec_->Loaded()){ rec_->FireRecSignal(sid, id); @@ -273,7 +281,7 @@ } } ////////decoder - void Wrapper::BuildDecoder(){ + void Wrapper::OpenDecoder(){ run_dec_ = true; } @@ -283,6 +291,10 @@ } } + void Wrapper::CloseStream(){ + run_stream_ = false; + } + void Wrapper::GetPacket(unsigned char **pktData, int *size, int *key){ if (stream_){ stream_->GetPacket(pktData, size, key); @@ -298,69 +310,6 @@ // return val: -1 open error; -2, find stream error; -3, converter create namespace cffmpeg_wrap{ // start test functions - uint8_t* Decode(const char *file, const int gb, int *w, int *h){ - VideoProp prop; - prop.url_ = file; - prop.gpu_acc_ = false; - - std::unique_ptr<FormatIn> in(new FormatIn(prop.gpuAccl())); - int flag = -1; - if (gb){ - flag = in->openGb28181(file, NULL); - }else{ - flag = in->open(file, NULL); - } - - std::unique_ptr<cvbridge> bridge_(nullptr); - - if(flag == 0){ - if(!in->findStreamInfo(NULL)){ - logIt("yolo can't find video stream\n"); - *w = *h = -2; - return NULL; - } - auto flag = in->openCodec(NULL); - if(flag){ - auto dec_ctx = in->getCodecContext(); - - AVPixelFormat pix_fmt = AV_PIX_FMT_BGR24; - bridge_.reset(new cvbridge( - dec_ctx->width, dec_ctx->height, dec_ctx->pix_fmt, - dec_ctx->width, dec_ctx->height, pix_fmt, SWS_BICUBIC)); - - }else{ - logIt("FormatIn openCodec Failed!"); - *w = *h = -3; - return NULL; - } - }else{ - logIt("open %s error", file); - *w = *h = -1; - return NULL; - } - - uint8_t *pic = NULL; - *w = *h = 0; - - int tryTime = 0; - while (tryTime++ < 100){ - - auto data(std::make_shared<CodedData>()); - if (in->readPacket(&data->getAVPacket()) == 0){ - - auto frame(std::make_shared<FrameData>()); - AVFrame *frm = frame->getAVFrame(); - if(in->decode(frm, &data->getAVPacket()) == 0){ - *w = frm->width; - *h = frm->height; - pic = bridge_->convert2Data(frm); - break; - } - } - } - - return pic; - } /////// for encoder typedef struct _PicEncoder{ FormatOut *enc; @@ -369,11 +318,13 @@ int fps; int br; int gi; + int pix_fmt; int flag; cvbridge *bridge; } PicEncoder; - void *CreateEncoder(const int w, const int h, const int fps, const int br, const int scale_flag, const int gi){ + void *CreateEncoder(const int w, const int h, const int fps, const int br, + const int pix_fmt, const int scale_flag, const int gi){ PicEncoder *e = (PicEncoder*)malloc(sizeof(PicEncoder)); e->enc = NULL; @@ -382,6 +333,7 @@ e->fps = fps; e->br = br; e->gi = gi; + e->pix_fmt = pix_fmt; e->flag = scale_flag; e->bridge = NULL; @@ -415,14 +367,16 @@ PicEncoder *e = (PicEncoder*)hdl; auto ctx = e->enc->getCodecContext(); - AVPixelFormat pix_fmt = AV_PIX_FMT_BGR24; if (e->bridge == NULL){ e->bridge = new cvbridge( - w, h, AV_PIX_FMT_BGR24, + w, h, e->pix_fmt, e->w, e->h, ctx->pix_fmt, e->flag); } - AVFrame *frame = cvbridge::fillFrame(in, w, h, pix_fmt); + AVFrame *bgr_frame = cvbridge::fillFrame(in, w, h, e->pix_fmt); + AVFrame *frame = e->bridge->convert2Frame(bgr_frame); + av_frame_free(&bgr_frame); + AVPacket *pkt = av_packet_alloc(); auto flag = e->enc->encode(pkt, frame); @@ -450,57 +404,6 @@ return flag; } -/////////////////////////////////////////////////////////// - typedef struct _conv - { - int srcW; - int srcH; - int srcF; - int dstW; - int dstH; - cvbridge *b; - }Conv; - - void *CreateConvertor(const int srcW, const int srcH, const int srcFormat, - const int dstW, const int dstH, const int dstFormat, const int flag){ - - auto bridge = new cvbridge( - srcW, srcH, srcFormat, - dstW, dstH, dstFormat, flag); - if (!bridge) return NULL; - - Conv *c = (Conv*)malloc(sizeof(Conv)); - c->b = bridge; - c->dstW = dstW; - c->dstH = dstH; - c->srcW = srcW; - c->srcH = srcH; - c->srcF = srcFormat; - - return c; - } - - uint8_t *Convert(void *h, uint8_t *src){ - Conv *c = (Conv*)h; - - auto b = c->b; - - AVFrame *tmp_frm = cvbridge::fillFrame(src, c->srcW, c->srcH, c->srcF); - if (!tmp_frm) return NULL; - - unsigned char *picData = b->convert2Data(tmp_frm); - - av_frame_free(&tmp_frm); - - return picData; - } - - void DestoryConvertor(void *h){ - Conv *c = (Conv*)h; - delete c->b; - free(c); - } - int GetGb28181Pic(const char *rtspUrl, char *retData, int *retDataLen){ int ret = 0; std::string fn = rtspUrl; @@ -521,6 +424,5 @@ handle_gb28181->deleteCamera(); return ret; } - } -- Gitblit v1.8.0