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