From be9c1d1f659b0ff31f656424c478e83a4f7c53b5 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期五, 20 九月 2019 11:44:19 +0800 Subject: [PATCH] update ffmpeg --- csrc/wrapper.cpp | 98 +++++++++++++++++++++++++++--------------------- 1 files changed, 55 insertions(+), 43 deletions(-) diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp index 9fc2e25..9f0e4e7 100644 --- a/csrc/wrapper.cpp +++ b/csrc/wrapper.cpp @@ -21,12 +21,20 @@ #include "buz/recorder.hpp" -#include "stream.hpp" -#include "decoder.hpp" -#include "rec.hpp" +#include "worker/stream.hpp" +#include "worker/decoder.hpp" +#include "worker/rec.hpp" using namespace logif; using namespace ffwrapper; + +#define DELETE_POINTER(p) \ +do \ +{ \ +if(NULL != p) \ +delete p; \ +p = NULL; \ +}while(0) namespace cffmpeg_wrap{ using namespace buz; @@ -36,14 +44,14 @@ ,scale_w_(0) ,scale_h_(0) ,scale_f_(SWS_POINT) + ,audio_(false) ,gb_(0) ,cpu_(0) - ,use_decoder_(false) ,thread_(nullptr) ,stop_stream_(false) ,stream_(nullptr) ,decoder_(nullptr) - ,rec_(nullptr) + ,rec_(new rec) { makeTheWorld(); } @@ -57,25 +65,12 @@ stop_stream_.store(true); thread_->join(); } + DELETE_POINTER(rec_); } catch(const std::exception& e) { logIt("WRAPPER EXCEPTION: ", e.what()); } - } - - void Wrapper::ScalePicture(const int w, const int h, const int flags){ - scale_w_ = w; - scale_f_ = flags; - scale_h_ = h; - } - - void Wrapper::UseGB28181(){ - gb_ = 1; - } - - void Wrapper::UseCPU(){ - cpu_ = 1; } std::unique_ptr<ffwrapper::FormatIn> Wrapper::init_reader(const char* input){ @@ -98,7 +93,7 @@ } if(flag == 0){ if(!in->findStreamInfo(NULL)){ - logIt("yolo can't find video stream\n"); + logIt("can't find video stream\n"); return nullptr; } @@ -123,19 +118,35 @@ return 0; } - void Wrapper::init_stream(){ - if (stream_) delete stream_; - stream_ = new stream; + void Wrapper::AudioSwitch(const bool a){ + audio_ = a; + if (stream_){ + stream_->AudioSwitch(a); + } } - void Wrapper::init_decoder(ffwrapper::FormatIn *in){ - if (decoder_) delete decoder_; - decoder_ = new decoder(in, scale_w_, scale_h_,scale_f_); + void Wrapper::init_worker(ffwrapper::FormatIn *in){ + if (rec_->Loaded() && stream_ && decoder_) return; + stream_ = new stream(in, 3 * 25); + stream_->AudioSwitch(audio_); + + decoder_ = new decoder(in, scale_w_, scale_h_, scale_f_); + + rec_->Load(in); + if(fn_rec_lazy_) fn_rec_lazy_(in); + } + + void Wrapper::run_worker(ffwrapper::FormatIn *in, std::shared_ptr<ffwrapper::CodedData> data, int64_t &id){ + + if (stream_) stream_->SetPacket(data); + if (decoder_) decoder_->SetFrame(data, id); + if (rec_->Loaded()) rec_->SetPacket(data, id); } - void Wrapper::init_rec(ffwrapper::FormatIn *in){ - if (rec_) delete rec_; - rec_ = new rec(in); + void Wrapper::deinit_worker(){ + DELETE_POINTER(stream_); + DELETE_POINTER(decoder_); + rec_->Unload(); } void Wrapper::run_stream_thread(){ @@ -148,11 +159,8 @@ usleep(200000); continue; } - init_stream(); - if (use_decoder_){ - init_decoder(in.get()); - } - init_rec(in.get()); + + init_worker(in.get()); int64_t id = 0; while(!stop_stream_.load()){ @@ -161,24 +169,28 @@ logIt("read packet error"); break; } - if (stream_) stream_->SetPacket(data); - if (use_decoder_ && decoder_) decoder_->SetFrame(data, id); - if (rec_) rec_->SetPacket(data, id); - + + run_worker(in.get(), data, id); id++; } + + deinit_worker(); } } - void Wrapper::BuildRecorder(const char* id, const char *output, const int mindur, const int maxdur){ + void Wrapper::BuildRecorder(const char* id, const char *output, const int mindur, const int maxdur, const bool audio){ - if (rec_){ - rec_->NewRec(id, output, mindur, maxdur); + if (rec_->Loaded()){ + rec_->NewRec(id, output, mindur, maxdur, audio); + }else{ + std::string rid(id), dir(output); + fn_rec_lazy_ = + [=](ffwrapper::FormatIn *in){rec_->NewRec(rid.c_str(), dir.c_str(), mindur, maxdur, audio);}; } } int Wrapper::FireRecorder(const char* sid,const int64_t &id){ - if (rec_){ + if (rec_->Loaded()){ rec_->FireRecSignal(sid, id); } } @@ -190,7 +202,7 @@ } ////////decoder void Wrapper::BuildDecoder(){ - use_decoder_ = true; + // use_decoder_ = true; } void Wrapper::GetPicDecoder(unsigned char **data, int *w, int *h, int64_t *id){ -- Gitblit v1.8.0