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