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