From 9792631e9d038ac34e287323961b78cc3d470873 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期二, 24 九月 2019 17:18:11 +0800 Subject: [PATCH] bug fix --- csrc/ffmpeg/format/FormatIn.cpp | 14 ++++-- csrc/wrapper.cpp | 16 +++++--- csrc/worker/decoder.cpp | 60 ------------------------------ csrc/wrapper.hpp | 3 + csrc/worker/decoder.hpp | 10 ---- 5 files changed, 22 insertions(+), 81 deletions(-) diff --git a/csrc/ffmpeg/format/FormatIn.cpp b/csrc/ffmpeg/format/FormatIn.cpp index 6313eda..c5eb651 100644 --- a/csrc/ffmpeg/format/FormatIn.cpp +++ b/csrc/ffmpeg/format/FormatIn.cpp @@ -47,8 +47,11 @@ io_ctx_ = NULL; } if(ctx_){ - avformat_close_input(&ctx_); - avformat_free_context(ctx_); + if (!ctx_->oformat){ + avformat_free_context(ctx_); + }else{ + avformat_close_input(&ctx_); + } ctx_ = NULL; if(dec_ctx_){ avcodec_close(dec_ctx_); @@ -83,7 +86,7 @@ auto err = av_probe_input_buffer(ctx_->pb, &ctx_->iformat, NULL, NULL, 0, read_io_buff_size_); if(err != 0){ logIt("open with custom io prob input buffer error:%d\n", err); - logIt("failed:%s", getAVErrorDesc(err).c_str()); + logIt("custom io failed:%s", getAVErrorDesc(err).c_str()); return -1; } @@ -106,9 +109,10 @@ int ret = openWithCustomIO(handle_gb28181, handle_gb28181->readData, options); if(ret < 0){ logIt("do openWithCustomIO failed:%d",ret); - } + }else{ + ret = avformat_open_input(&ctx_, "", NULL, options); + } - ret = avformat_open_input(&ctx_, "", NULL, options); // if(ret < 0){ // logIt("open %s failed:%s",filename, // getAVErrorDesc(ret).c_str()); diff --git a/csrc/worker/decoder.cpp b/csrc/worker/decoder.cpp index 4211b41..ae3eb13 100644 --- a/csrc/worker/decoder.cpp +++ b/csrc/worker/decoder.cpp @@ -3,7 +3,6 @@ #include "../ffmpeg/bridge/cvbridge.hpp" #include "../ffmpeg/format/FormatIn.hpp" #include "../ffmpeg/data/CodedData.hpp" -#include "../ffmpeg/data/FrameData.hpp" #include "../ffmpeg/log/log.hpp" extern "C"{ @@ -24,24 +23,12 @@ ,conv_h_(h) ,conv_flag_(f) ,decRef_(dec) - ,thread_(nullptr) - ,stop_{false} {} decoder::~decoder(){ - if (thread_){ - stop_.store(true); - thread_->join(); - } if (conv_){ delete conv_; - } - - - { - std::lock_guard<std::mutex> l(mutex_pkt_); - list_pkt_.clear(); } { @@ -102,57 +89,11 @@ return list_pic_.size(); } - void decoder::Start(){ - if (thread_) return; - thread_.reset(new std::thread([&]{ - if (initDecoder() != 0) { - return; - } - - while(!stop_.load()){ - - std::unique_lock<std::mutex> locker(mutex_pkt_); - cv_.wait(locker, [&]{ - return !list_pkt_.empty() || stop_.load(); - }); - if (stop_.load()){ - break; - } - - auto pkt = list_pkt_.front(); - list_pkt_.pop_front(); - - AVFrame *frame = av_frame_alloc(); - AVPacket np(pkt.data->getAVPacket()); - av_copy_packet(&np, &pkt.data->getAVPacket()); - - auto ret = decRef_->decode(frame, &np); - av_packet_unref(&np); - - if (ret == 0){ - saveFrame(frame, pkt.id); - } - av_frame_free(&frame); - } - - })); - } - int decoder::SetFrame(std::shared_ptr<ffwrapper::CodedData> data, int64_t &id){ if (!data) return -1; if (decRef_->isAudioPkt(&data->getAVPacket())) return -2; - // if (!thread_){ - // if (initDecoder() != 0) return -3; - // Start(); - // } - - // std::lock_guard<std::mutex> l(mutex_pkt_); - // list_pkt_.push_back({data, id}); - // cv_.notify_one(); - // return list_pkt_.size(); - if (!conv_){ if (initDecoder() != 0) return -3; } @@ -167,7 +108,6 @@ saveFrame(frame, id); } av_frame_free(&frame); - } void decoder::GetFrame(unsigned char **data, int *w, int *h, int64_t *id){ diff --git a/csrc/worker/decoder.hpp b/csrc/worker/decoder.hpp index 3bb3a18..ae9fba2 100644 --- a/csrc/worker/decoder.hpp +++ b/csrc/worker/decoder.hpp @@ -9,15 +9,13 @@ #include <atomic> #include <condition_variable> -#include "../common.hpp" - struct AVFrame; namespace ffwrapper { class FormatIn; class cvbridge; - + class CodedData; } // namespace ffwrapper namespace cffmpeg_wrap @@ -41,12 +39,6 @@ std::list<BGR24> list_pic_; std::mutex mutex_pic_; - std::unique_ptr<std::thread> thread_; - std::atomic_bool stop_; - - std::list<CPacket> list_pkt_; - std::mutex mutex_pkt_; - std::condition_variable cv_; private: int initDecoder(); int saveFrame(AVFrame *frame, int64_t &id); diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp index 3ad04cb..f1520df 100644 --- a/csrc/wrapper.cpp +++ b/csrc/wrapper.cpp @@ -46,6 +46,7 @@ ,audio_(false) ,gb_(0) ,cpu_(0) + ,run_dec_(false) ,thread_(nullptr) ,stop_stream_(false) ,stream_(nullptr) @@ -133,14 +134,17 @@ decoder_ = new decoder(in, scale_w_, scale_h_, scale_f_); rec_->Load(in); - if(fn_rec_lazy_) fn_rec_lazy_(in); + if(fn_rec_lazy_) { + fn_rec_lazy_(); + fn_rec_lazy_ = nullptr; + } } void Wrapper::run_worker(ffwrapper::FormatIn *in, std::shared_ptr<ffwrapper::CodedData> data, int64_t &id){ if (stream_) stream_->SetPacket(data, id); + if (decoder_ && run_dec_) decoder_->SetFrame(data, id); if (rec_->Loaded()) rec_->SetPacket(data, id); - if (decoder_) decoder_->SetFrame(data, id); } void Wrapper::deinit_worker(){ @@ -191,7 +195,7 @@ }else{ std::string rid(id), dir(output); fn_rec_lazy_ = - [=](ffwrapper::FormatIn *in){rec_->NewRec(rid.c_str(), dir.c_str(), mindur, maxdur, audio);}; + [=]{rec_->NewRec(rid.c_str(), dir.c_str(), mindur, maxdur, audio);}; } } @@ -208,7 +212,7 @@ } ////////decoder void Wrapper::BuildDecoder(){ - // use_decoder_ = true; + run_dec_ = true; } void Wrapper::GetPicDecoder(unsigned char **data, int *w, int *h, int64_t *id){ @@ -216,7 +220,7 @@ decoder_->GetFrame(data, w, h, id); } } - + void Wrapper::GetPacket(unsigned char **pktData, int *size, int *key){ if (stream_){ stream_->GetPacket(pktData, size, key); @@ -275,7 +279,7 @@ uint8_t *pic = NULL; *w = *h = 0; - + int tryTime = 0; while (tryTime++ < 100){ diff --git a/csrc/wrapper.hpp b/csrc/wrapper.hpp index a6ebe55..ed9a9ee 100644 --- a/csrc/wrapper.hpp +++ b/csrc/wrapper.hpp @@ -62,6 +62,7 @@ int scale_w_, scale_h_, scale_f_; bool audio_; int gb_, cpu_; + bool run_dec_; // decoder 鍙傛暟 std::unique_ptr<std::thread> thread_; std::atomic_bool stop_stream_; @@ -73,7 +74,7 @@ // 褰曞儚绫�,涓�鐩村瓨鍦� rec* rec_; // 褰曞儚璇锋眰缂撳瓨,绛夊緟runstream鍚庢坊鍔� - std::function<void(ffwrapper::FormatIn*)> fn_rec_lazy_; + std::function<void()> fn_rec_lazy_; }; uint8_t* Decode(const char *file, const int gb, int *w, int *h); -- Gitblit v1.8.0