From e6725cb3cf4ced3a6985d4d3db4d5cf1336a30d8 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期五, 19 七月 2019 16:53:35 +0800
Subject: [PATCH] merge so
---
csrc/wrapper.cpp | 39 ++++++++++++++++---
csrc/wrapper.hpp | 3 +
goffmpeg.go | 34 +++++++++++-----
cffmpeg.h | 2 +
libcffmpeg.c | 12 ++++++
csrc/cffmpeg.cpp | 11 +++++
libcffmpeg.h | 6 +++
7 files changed, 89 insertions(+), 18 deletions(-)
diff --git a/cffmpeg.h b/cffmpeg.h
index 1eb6536..c7bf9d1 100644
--- a/cffmpeg.h
+++ b/cffmpeg.h
@@ -17,6 +17,8 @@
void c_ffmpeg_run(const cffmpeg h, const char *input);
void c_ffmpeg_scale(const cffmpeg h, const int wid, const int hei, const int flags);
+void c_ffmpeg_run_gb28181(const cffmpeg h);
+void c_ffmepg_use_cpu(const cffmpeg h);
/////////passive api
void c_ffmpeg_build_recorder(const cffmpeg h, const char *dir, int mind, int maxd);
void c_ffmpeg_fire_recorder(const cffmpeg h, const int64_t id);
diff --git a/csrc/cffmpeg.cpp b/csrc/cffmpeg.cpp
index 4c5ddb8..b78313e 100644
--- a/csrc/cffmpeg.cpp
+++ b/csrc/cffmpeg.cpp
@@ -36,6 +36,17 @@
s->ScalePicture(wid, hei, flags);
}
+void c_ffmpeg_run_gb28181(const cffmpeg h){
+ Wrapper *s = (Wrapper*)h;
+ s->UseGB28181();
+}
+
+void c_ffmepg_use_cpu(const cffmpeg h){
+ Wrapper *s = (Wrapper*)h;
+ s->UseCPU();
+}
+
+
//////passive api
void c_ffmpeg_build_recorder(const cffmpeg h, const char *dir, int mind, int maxd){
Wrapper *s = (Wrapper*)h;
diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp
index c939599..35137c7 100644
--- a/csrc/wrapper.cpp
+++ b/csrc/wrapper.cpp
@@ -37,7 +37,9 @@
,scale_w_(0)
,scale_h_(0)
,scale_f_(SWS_POINT)
- ,encoder_(NULL)
+ ,gb_(0)
+ ,cpu_(0)
+ ,encoder_(nullptr)
{
makeTheWorld();
}
@@ -66,11 +68,20 @@
scale_h_ = h;
}
+ void Wrapper::UseGB28181(){
+ gb_ = 1;
+ }
+
+ void Wrapper::UseCPU(){
+ cpu_ = 1;
+ }
+
std::unique_ptr<ffwrapper::FormatIn> Wrapper::init_reader(const char* input){
VideoProp prop;
prop.url_ = input;
prop.rtsp_tcp_ = true;
+ prop.gpu_acc_ = !cpu_;
std::unique_ptr<FormatIn> in(new FormatIn(prop.gpuAccl()));
AVDictionary *avdic = prop.optsFormat();
@@ -113,8 +124,8 @@
VideoProp prop;
prop.url_ = input;
prop.rtsp_tcp_ = true;
+ prop.gpu_acc_ = !cpu_;
-// std::unique_ptr<FormatIn> in(new FormatIn(prop.gpuAccl()));
ffwrapper::FormatIn* in(new FormatIn(prop.gpuAccl()));
AVDictionary *avdic = prop.optsFormat();
int flag = in->openGb28181(input, &avdic);
@@ -185,15 +196,24 @@
}
void Wrapper::run_stream_thread(){
+
+ std::unique_ptr<FormatIn> fi(nullptr);
+
while(!stop_stream_.load()){
- //auto in = init_reader(input_url_.c_str());
- ffwrapper::FormatIn * in = init_reader_gb28181(input_url_.c_str());
+ FormatIn *in = NULL;
+ if (!gb_){
+ fi = init_reader(input_url_.c_str());
+ in = fi.get();
+ }else{
+ in = init_reader_gb28181(input_url_.c_str());
+ }
if (!in) {
- logIt("ERROR: init_reader_gb28181!\n");
+
+ logIt("ERROR: init_reader!\n");
usleep(200000);
continue;
}
- init_worker(in.get());
+ init_worker(in);
int64_t id = 0;
avpacket pkt;
@@ -207,7 +227,7 @@
}
pkt.data = data;
- run_worker(in.get(), pkt);
+ run_worker(in, pkt);
if(!data){
break;
}
@@ -216,6 +236,11 @@
if(id % 250 == 0)
recorder_->FireRecorder(id);
}
+ if (gb_){
+ delete in;
+ }else{
+ fi.reset(nullptr);
+ }
}
}
diff --git a/csrc/wrapper.hpp b/csrc/wrapper.hpp
index 1145044..c1b56e0 100644
--- a/csrc/wrapper.hpp
+++ b/csrc/wrapper.hpp
@@ -73,6 +73,8 @@
FUNC_REC func);
void ScalePicture(const int w, const int h, const int flags);
+ void UseGB28181();
+ void UseCPU();
public: //decoder
void BuildDecoder();
void GetPicDecoder(unsigned char **data, int *w, int *h);
@@ -109,6 +111,7 @@
FUNC_DEC func_dec_;
int scale_w_, scale_h_, scale_f_;
+ int gb_, cpu_;
//////////////////test frame to bgr24
public:
uint8_t *decodeJPEG(const char *file, int *w, int *h);
diff --git a/goffmpeg.go b/goffmpeg.go
index 33869c0..b8739f8 100644
--- a/goffmpeg.go
+++ b/goffmpeg.go
@@ -59,24 +59,36 @@
}
}
+// Config config
+type Config struct {
+ Scale int
+ Width int
+ Height int
+ GB bool
+ CPU bool
+}
+
// GoFFMPEG handle for c
type GoFFMPEG struct {
ffmpeg C.cffmpeg
}
-// New create handle
-func New() *GoFFMPEG {
- return &GoFFMPEG{
- ffmpeg: C.wrap_fn_create(),
- }
-}
-
-// NewWithScale scale out pic
-func NewWithScale(w, h int, flag int) *GoFFMPEG {
+// New 2nd new
+func New(conf Config) *GoFFMPEG {
f := C.wrap_fn_create()
- if f != nil {
- C.wrap_fn_scale(f, C.int(w), C.int(h), C.int(flag))
+ 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,
}
diff --git a/libcffmpeg.c b/libcffmpeg.c
index 3b3541f..bd66a10 100644
--- a/libcffmpeg.c
+++ b/libcffmpeg.c
@@ -25,6 +25,10 @@
release_if_err(fn_run, lib);
fn_scale = (lib_cffmpeg_scale)dlsym(lib, "c_ffmpeg_scale");
release_if_err(fn_scale, lib);
+ fn_gb28181 = (lib_cffmpeg_gb28181)dlsym(lib, "c_ffmpeg_run_gb28181");
+ release_if_err(fn_gb28181, lib);
+ fn_cpu = (lib_cffmpeg_cpu)dlsym(lib, "c_ffmepg_use_cpu");
+ release_if_err(fn_cpu, lib);
fn_recorder = (lib_cffmpeg_recorder)dlsym(lib, "c_ffmpeg_build_recorder");
release_if_err(fn_recorder, lib);
fn_fire_recorder = (lib_cffmpeg_fire_recorder)dlsym(lib, "c_ffmpeg_fire_recorder");
@@ -77,6 +81,14 @@
fn_scale(h, wid, hei, flags);
}
+void wrap_fn_run_gb28181(const cffmpeg h){
+ fn_gb28181(h);
+}
+
+void wrap_fn_use_cpu(const cffmpeg h){
+ fn_cpu(h);
+}
+
void wrap_fn_recorder(const cffmpeg h, const char* dir, int mind, int maxd){
fn_recorder(h, dir, mind, maxd);
}
diff --git a/libcffmpeg.h b/libcffmpeg.h
index 16cb761..d083536 100644
--- a/libcffmpeg.h
+++ b/libcffmpeg.h
@@ -17,6 +17,8 @@
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);
+typedef void (*lib_cffmpeg_gb28181)(const cffmpeg);
+typedef void (*lib_cffmpeg_cpu)(const cffmpeg);
typedef void (*lib_cffmpeg_recorder)(const cffmpeg, const char*, int, int);
typedef void (*lib_cffmpeg_fire_recorder)(const cffmpeg, const int64_t);
typedef char*(*lib_cffmpeg_info_recorder)(const cffmpeg, int*, int*);
@@ -30,6 +32,8 @@
static lib_cffmpeg_destroy fn_destroy = NULL;
static lib_cffmpeg_run fn_run = NULL;
static lib_cffmpeg_scale fn_scale = NULL;
+static lib_cffmpeg_gb28181 fn_gb28181 = NULL;
+static lib_cffmpeg_cpu fn_cpu = NULL;
static lib_cffmpeg_recorder fn_recorder = NULL;
static lib_cffmpeg_fire_recorder fn_fire_recorder = NULL;
static lib_cffmpeg_info_recorder fn_info_recorder = NULL;
@@ -47,6 +51,8 @@
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);
+void wrap_fn_run_gb28181(const cffmpeg h);
+void wrap_fn_use_cpu(const cffmpeg h);
void wrap_fn_recorder(const cffmpeg h, const char* dir, int mind, int maxd);
void wrap_fn_fire_recorder(const cffmpeg h, const int64_t id);
char* wrap_fn_info_recorder(const cffmpeg, int*, int*);
--
Gitblit v1.8.0