From faff95860fec680d5fd0a518e4cd240a99381257 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期三, 25 九月 2019 17:13:37 +0800
Subject: [PATCH] add log

---
 csrc/wrapper.cpp                 |   40 +++++++++----
 csrc/wrapper.hpp                 |    2 
 csrc/ffmpeg/format/FormatOut.cpp |   26 ++++++++
 goffmpeg.go                      |   29 +++++++++
 cffmpeg.h                        |    2 
 csrc/ffmpeg/log/log.cpp          |   16 ++++-
 libcffmpeg.c                     |    4 
 csrc/cffmpeg.cpp                 |    6 +
 csrc/ffmpeg/log/log.hpp          |    1 
 libcffmpeg.h                     |    4 
 10 files changed, 104 insertions(+), 26 deletions(-)

diff --git a/cffmpeg.h b/cffmpeg.h
index 08e32f9..93f1754 100644
--- a/cffmpeg.h
+++ b/cffmpeg.h
@@ -9,7 +9,7 @@
 
 typedef void* cffmpeg;
 
-cffmpeg c_ffmpeg_create();
+cffmpeg c_ffmpeg_create(const int, const char *logfile);
 void c_ffmpeg_destroy(const cffmpeg h);
 void c_ffmpeg_run(const cffmpeg h, const char *input);
 
diff --git a/csrc/cffmpeg.cpp b/csrc/cffmpeg.cpp
index 9365842..331aa3b 100644
--- a/csrc/cffmpeg.cpp
+++ b/csrc/cffmpeg.cpp
@@ -17,8 +17,10 @@
 
 using namespace cffmpeg_wrap;
 
-cffmpeg c_ffmpeg_create(){
-    return new Wrapper;
+cffmpeg c_ffmpeg_create(const int log, const char *logfile){
+    bool logit = false;
+    if (log) logit = true;
+    return new Wrapper(logit, logfile);
 }
 
 void c_ffmpeg_destroy(const cffmpeg h){
diff --git a/csrc/ffmpeg/format/FormatOut.cpp b/csrc/ffmpeg/format/FormatOut.cpp
index dce3f7e..135590b 100644
--- a/csrc/ffmpeg/format/FormatOut.cpp
+++ b/csrc/ffmpeg/format/FormatOut.cpp
@@ -387,14 +387,36 @@
             logIt("adjustPTS pkt stream index too much");
             return;
         }
+        
+        if (pkt->pts == AV_NOPTS_VALUE && pkt->pts == AV_NOPTS_VALUE){
+            int64_t time_stamp = frame_cnt;
+        
+            pkt->pos = -1;  
+            pkt->stream_index = 0;
+            //Write PTS
+            AVRational time_base = getStream()->time_base;
+
+            AVRational time_base_q = { 1, AV_TIME_BASE };
+            //Duration between 2 frames (us)
+            // int64_t calc_duration = (double)(AV_TIME_BASE)*(1 / fps_);  //鍐呴儴鏃堕棿鎴�
+            int64_t calc_duration = (int64_t)(AV_TIME_BASE / fps_);  //鍐呴儴鏃堕棿鎴�
+            //Parameters
+            pkt->pts = av_rescale_q(time_stamp*calc_duration, time_base_q, time_base);
+            pkt->dts = pkt->pts;
+            pkt->duration = av_rescale_q(calc_duration, time_base_q, time_base); 
+            return;
+        }
 
         AVStream *in_stream,*out_stream;
         
         in_stream = in_ctx_->streams[pkt->stream_index];
         out_stream = ctx_->streams[pkt->stream_index];
         
-        // logIt("BEFORE stream %d, pts: %lld, dts: %lld, duration: %lld", 
-        // pkt->stream_index, pkt->pts, pkt->dts, pkt->duration);
+        // logIt("BEFORE in stream timebase %d:%d, out timebase %d:%d, \
+        //         pts: %lld, dts: %lld, duration: %lld", 
+        //     in_stream->time_base.num, in_stream->time_base.den,
+        //     out_stream->time_base.num, out_stream->time_base.den,
+        //     pkt->pts, pkt->dts, pkt->duration);
 
         //杞崲 PTS/DTS 鏃跺簭
         pkt->pts = av_rescale_q_rnd(pkt->pts,in_stream->time_base,out_stream->time_base,(enum AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
diff --git a/csrc/ffmpeg/log/log.cpp b/csrc/ffmpeg/log/log.cpp
index f706a73..626574e 100644
--- a/csrc/ffmpeg/log/log.cpp
+++ b/csrc/ffmpeg/log/log.cpp
@@ -58,12 +58,20 @@
             file_name + "-" +
             makeTimeStamp() +
             ".tlog");
-        rotateLog(logfile.c_str(), kRotateLogFileSize, kRotateLogFileCount, show_stdout);
+        
+        CreateLogger(logfile.c_str(), show_stdout);
+    }
+
+    void CreateLogger(const char *name, const bool show_stdout){
+
+        rotateLog(name, kRotateLogFileSize, kRotateLogFileCount, show_stdout);
 
         log_run = true;
     }
+
 	void DestroyLogger(){
-		spdlog::drop_all();
+        if (log_run)
+		    spdlog::drop_all();
 	}
 
     void logIt(const char *fmt, ...){
@@ -76,7 +84,9 @@
         va_end(args);       //缁撴潫鍙彉鍙傛暟鐨勮幏鍙�  
 
         if(log_run){
-            spdlog::get(log_name)->error(temp);
+            std::string lc(temp);
+            lc = "LIB-libcffmpeg.so-> " + lc;
+            spdlog::get(log_name)->error(lc);
         }else{
             printf("%s\n", temp);
         }
diff --git a/csrc/ffmpeg/log/log.hpp b/csrc/ffmpeg/log/log.hpp
index b61edfe..a7d9f54 100644
--- a/csrc/ffmpeg/log/log.hpp
+++ b/csrc/ffmpeg/log/log.hpp
@@ -3,6 +3,7 @@
 
 namespace logif{
 	void CreateLogger(const char *dir, const char *name, const bool show_stdout);
+	void CreateLogger(const char *name, const bool show_stdout);
 	void DestroyLogger();
 
 	void logIt(const char *fmt, ...);
diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp
index 9af3085..7bba3de 100644
--- a/csrc/wrapper.cpp
+++ b/csrc/wrapper.cpp
@@ -38,7 +38,7 @@
 namespace cffmpeg_wrap{
     using namespace buz;
 
-    Wrapper::Wrapper()
+    Wrapper::Wrapper(const bool logit, const char *logfile)
     :input_url_("")
     ,scale_w_(0)
     ,scale_h_(0)
@@ -54,6 +54,9 @@
     ,rec_(new rec)
     {
         makeTheWorld();
+        if (logit){
+            logif::CreateLogger(logfile, true);
+        }
     }
 
 
@@ -71,6 +74,7 @@
         {
             logIt("WRAPPER EXCEPTION: ", e.what());
         }
+        logif::DestroyLogger();
     }
 
     std::unique_ptr<ffwrapper::FormatIn> Wrapper::init_reader(const char* input){
@@ -120,16 +124,16 @@
 
     void Wrapper::AudioSwitch(const bool a){
         audio_ = a;
-        if (stream_){
-            stream_->AudioSwitch(a);
-        }
+        // if (stream_){
+        //     stream_->AudioSwitch(a);
+        // }
     }
 
     void Wrapper::init_worker(ffwrapper::FormatIn *in){
         if (rec_->Loaded() && stream_ && decoder_) return;
 
         stream_ = new stream(in, 3 * 25);
-        stream_->AudioSwitch(audio_);
+        // stream_->AudioSwitch(audio_);
 
         decoder_ = new decoder(in, scale_w_, scale_h_, scale_f_);
 
@@ -141,7 +145,10 @@
     }
     
     void Wrapper::run_worker(ffwrapper::FormatIn *in, std::shared_ptr<ffwrapper::CodedData> data, int64_t &id){
-
+        if (gb_){
+            AVPacket &pkt = data->getAVPacket();
+            pkt.pts = pkt.dts = AV_NOPTS_VALUE;
+        }
         if (stream_) stream_->SetPacket(data, id);
         if (decoder_ && run_dec_) decoder_->SetFrame(data, id);
         if (rec_->Loaded()) rec_->SetPacket(data, id);
@@ -155,12 +162,17 @@
 
     void Wrapper::run_stream_thread(){
         
+        int tryTime = 0;
         while(!stop_stream_.load()){
             auto in = init_reader(input_url_.c_str());
             
             if (!in) {
                 logIt("ERROR: init_reader! url: %s\n", input_url_.c_str());
                 usleep(200000);
+                tryTime++;
+                if (tryTime == 50){
+                    break;
+                }
                 continue;
             }
             
@@ -170,18 +182,20 @@
 
             init_worker(in.get());
 
-            int64_t id = -1;
+            int64_t id = gb_ ? 0 : -1;
+
             while(!stop_stream_.load()){
                 auto data(std::make_shared<CodedData>());
                 if (in->readPacket(&data->getAVPacket()) != 0){
                     logIt("read packet error, id: %lld", id);
                     break;
                 }
-    	        if (id < 0){
+
+                if (!gb_ && id < 0){
                     id++;
                     continue;
                 }
-                
+    	        
                 run_worker(in.get(), data, id);
                 usleep(wTime);
 
@@ -193,13 +207,15 @@
     }
 
     void Wrapper::BuildRecorder(const char* id, const char *output, const int mindur, const int maxdur, const bool audio){
-        
+        bool a = audio;
+        if (gb_) a = false;
+
         if (rec_->Loaded()){
-            rec_->NewRec(id, output, mindur, maxdur, audio);
+            rec_->NewRec(id, output, mindur, maxdur, a);
         }else{
             std::string rid(id), dir(output);
             fn_rec_lazy_ = 
-            [=]{rec_->NewRec(rid.c_str(), dir.c_str(), mindur, maxdur, audio);};
+            [=]{rec_->NewRec(rid.c_str(), dir.c_str(), mindur, maxdur, a);};
         }
     }
 
diff --git a/csrc/wrapper.hpp b/csrc/wrapper.hpp
index ed9a9ee..9fce37d 100644
--- a/csrc/wrapper.hpp
+++ b/csrc/wrapper.hpp
@@ -27,7 +27,7 @@
 
     class Wrapper{
     public:
-        Wrapper();
+        explicit Wrapper(const bool logit, const char *logfile);
         ~Wrapper ();
     private: 
         std::unique_ptr<ffwrapper::FormatIn> init_reader(const char* input);
diff --git a/goffmpeg.go b/goffmpeg.go
index 1f68e1c..5fca4a9 100644
--- a/goffmpeg.go
+++ b/goffmpeg.go
@@ -75,7 +75,34 @@
 
 // New 2nd new
 func New(conf Config) *GoFFMPEG {
-	f := C.wrap_fn_create()
+
+	var l *C.char
+	f := C.wrap_fn_create(0, l)
+
+	if f == nil {
+		return nil
+	}
+	if conf.Scale != 0 && conf.Width != 0 && conf.Height != 0 {
+		C.wrap_fn_scale(f, C.int(conf.Width), C.int(conf.Height), C.int(conf.Scale))
+	}
+	if conf.GB {
+		C.wrap_fn_run_gb28181(f)
+	}
+	if conf.CPU {
+		C.wrap_fn_use_cpu(f)
+	}
+
+	return &GoFFMPEG{
+		ffmpeg: f,
+	}
+}
+
+// NewWithLog log
+func NewWithLog(conf Config, logfile string) *GoFFMPEG {
+	lf := C.CString(logfile)
+	defer C.free(unsafe.Pointer(lf))
+
+	f := C.wrap_fn_create(1, lf)
 	if f == nil {
 		return nil
 	}
diff --git a/libcffmpeg.c b/libcffmpeg.c
index dcdf5f9..44838d4 100644
--- a/libcffmpeg.c
+++ b/libcffmpeg.c
@@ -63,8 +63,8 @@
     }
 }
 
-cffmpeg wrap_fn_create(){
-    return fn_create();
+cffmpeg wrap_fn_create(const int log, const char *logfile){
+    return fn_create(log, logfile);
 }
 
 void wrap_fn_destroy(const cffmpeg h){
diff --git a/libcffmpeg.h b/libcffmpeg.h
index 89ebd05..47e7b5c 100644
--- a/libcffmpeg.h
+++ b/libcffmpeg.h
@@ -10,7 +10,7 @@
 
 typedef void* cffmpeg;
 
-typedef cffmpeg(*lib_cffmpeg_create)();
+typedef cffmpeg(*lib_cffmpeg_create)(const int, const char*);
 typedef void (*lib_cffmpeg_destroy)(const cffmpeg);
 typedef void (*lib_cffmpeg_run)(const cffmpeg, const char*);
 typedef void (*lib_cffmpeg_scale)(const cffmpeg, const int, const int, const int);
@@ -42,7 +42,7 @@
 libcffmpeg init_libcffmpeg(const char *so_file);
 void release_libcffmpeg(libcffmpeg lib);
 
-cffmpeg wrap_fn_create();
+cffmpeg wrap_fn_create(const int log, const char *logfile);
 void wrap_fn_destroy(const cffmpeg h);
 void wrap_fn_run(const cffmpeg h, const char* input);
 void wrap_fn_scale(const cffmpeg h, const int wid, const int hei, const int flags);

--
Gitblit v1.8.0