From e62936fa4a4b626a359bce8981ebbbaddcd4aada Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期二, 01 九月 2020 13:31:45 +0800
Subject: [PATCH] add devid
---
csrc/ffmpeg/format/FormatIn.cpp | 23 +++++++++++
csrc/wrapper.cpp | 3 +
csrc/wrapper.hpp | 7 +++
goffmpeg.go | 61 ++++++++++++++++++++++++++++++
cffmpeg.h | 2 +
libcffmpeg.c | 8 ++++
csrc/cffmpeg.cpp | 5 ++
libcffmpeg.h | 5 ++
csrc/ffmpeg/format/FormatIn.hpp | 2 +
9 files changed, 113 insertions(+), 3 deletions(-)
diff --git a/cffmpeg.h b/cffmpeg.h
index f1eeea7..1eb38cb 100644
--- a/cffmpeg.h
+++ b/cffmpeg.h
@@ -32,6 +32,8 @@
void* c_ffmpeg_get_avpacket(const cffmpeg h, int *size, int *key);
int c_ffmpeg_get_avpacket2(const cffmpeg h, unsigned char **data, int *size, int *key);
+int c_ffmpeg_set_devid(const cffmpeg h, const int devid);
+
void c_ffmpeg_release_buf(void* buf);
// pic encoder
diff --git a/csrc/cffmpeg.cpp b/csrc/cffmpeg.cpp
index e2afc1a..5d94f90 100644
--- a/csrc/cffmpeg.cpp
+++ b/csrc/cffmpeg.cpp
@@ -134,6 +134,11 @@
return s->GetPacket(data, size, key);
}
+int c_ffmpeg_set_devid(const cffmpeg h, const int devid){
+ Wrapper *s = (Wrapper*)h;
+ return s->SetDevID(devid);
+}
+
void c_ffmpeg_release_buf(void* buf){
if (buf){
free(buf);
diff --git a/csrc/ffmpeg/format/FormatIn.cpp b/csrc/ffmpeg/format/FormatIn.cpp
index 28b473b..d0efd33 100644
--- a/csrc/ffmpeg/format/FormatIn.cpp
+++ b/csrc/ffmpeg/format/FormatIn.cpp
@@ -28,6 +28,7 @@
,dec_ctx_(NULL)
,vs_idx_(-1)
,as_idx_(-1)
+ ,prop_(NULL)
,hw_accl_(hw)
,io_ctx_(NULL)
,read_io_buff_(NULL)
@@ -36,9 +37,28 @@
,fps_(25.0)
{}
+ FormatIn::FormatIn(const VideoProp &prop, bool hw/*=true*/)
+ :ctx_(NULL)
+ ,dec_ctx_(NULL)
+ ,vs_idx_(-1)
+ ,as_idx_(-1)
+ ,prop_(NULL)
+ ,hw_accl_(hw)
+ ,io_ctx_(NULL)
+ ,read_io_buff_(NULL)
+ ,read_io_buff_size_(32768)
+ ,handle_gb28181(NULL)
+ ,fps_(25.0)
+ {
+ prop_ = new VideoProp;
+ *prop_ = prop;
+ }
+
FormatIn::~FormatIn()
{
logIt("free format in");
+ if (prop_) delete prop_;
+
if(dec_ctx_){
avcodec_close(dec_ctx_);
avcodec_free_context(&dec_ctx_);
@@ -196,6 +216,9 @@
if(hw_accl_){
// idle_gpu = gpu::getGPUPrior(300, 1024, 0);
idle_gpu = gpu::getGPU(300);
+ if (prop_->gpu_index_ > -1){
+ idle_gpu = prop_->gpu_index_;
+ }
if(idle_gpu < 0){
logIt("NO GPU RESOURCE TO DECODE");
hw_accl_ = false;
diff --git a/csrc/ffmpeg/format/FormatIn.hpp b/csrc/ffmpeg/format/FormatIn.hpp
index e904145..cac25c2 100644
--- a/csrc/ffmpeg/format/FormatIn.hpp
+++ b/csrc/ffmpeg/format/FormatIn.hpp
@@ -24,6 +24,7 @@
{
public:
explicit FormatIn(bool hw=true);
+ explicit FormatIn(const VideoProp &prop, bool hw=true);
~FormatIn();
public:
@@ -56,6 +57,7 @@
int vs_idx_;
int as_idx_;
+ VideoProp *prop_;
bool hw_accl_;
double fps_;
private:
diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp
index 4964629..0a0e84f 100644
--- a/csrc/wrapper.cpp
+++ b/csrc/wrapper.cpp
@@ -45,6 +45,7 @@
,audio_(false)
,gb_(0)
,cpu_(0)
+ ,devid_(-1)
,run_dec_(false)
,run_stream_(true)
,run_rec_(false)
@@ -66,6 +67,7 @@
,audio_(false)
,gb_(0)
,cpu_(0)
+ ,devid_(-1)
,run_dec_(false)
,run_stream_(true)
,run_rec_(false)
@@ -108,6 +110,7 @@
prop.url_ = input;
prop.rtsp_tcp_ = true;
prop.gpu_acc_ = !cpu_;
+ prop.gpu_index_ = devid_;
std::unique_ptr<FormatIn> in(new FormatIn(prop.gpuAccl()));
int flag = -1;
diff --git a/csrc/wrapper.hpp b/csrc/wrapper.hpp
index 4802e8e..e2d9a8b 100644
--- a/csrc/wrapper.hpp
+++ b/csrc/wrapper.hpp
@@ -60,11 +60,16 @@
int GetPacket(unsigned char **pktData, int *size, int *key);
public: // recorder
void OpenRecorder();
+
+ public:
+ // set device id
+ int SetDevID(const int devid){ devid_ = devid; return 0;}
+
private:
// stream 鍙傛暟
std::string input_url_;
bool audio_;
- int gb_, cpu_;
+ int gb_, cpu_, devid_;
bool run_dec_;
bool run_stream_;
bool run_rec_;
diff --git a/goffmpeg.go b/goffmpeg.go
index bca75d2..136a1ba 100644
--- a/goffmpeg.go
+++ b/goffmpeg.go
@@ -92,6 +92,65 @@
}
}
+// NewWithDevID 2nd new
+func NewWithDevID(GB, CPU bool, devID int) *GoFFMPEG {
+
+ f := C.wrap_fn_create(unsafe.Pointer(libcffmpeg))
+
+ if f == nil {
+ return nil
+ }
+ if GB {
+ C.wrap_fn_run_gb28181(unsafe.Pointer(libcffmpeg), f)
+ }
+ if CPU {
+ C.wrap_fn_use_cpu(unsafe.Pointer(libcffmpeg), f)
+ } else if devID > -1 {
+ r := C.wrap_fn_set_devid(unsafe.Pointer(libcffmpeg), f, C.int(devID))
+ if r != 0 {
+ if f != nil {
+ C.wrap_fn_destroy(unsafe.Pointer(libcffmpeg), f)
+ }
+ FreeFFmpeg()
+ }
+ return nil
+ }
+
+ return &GoFFMPEG{
+ ffmpeg: f,
+ }
+}
+
+// NewWithLogAndDevID log
+func NewWithLogAndDevID(GB, CPU bool, devID int, ffmpegLog string) *GoFFMPEG {
+ lf := C.CString(ffmpegLog)
+ defer C.free(unsafe.Pointer(lf))
+
+ f := C.wrap_fn_create2(unsafe.Pointer(libcffmpeg), lf)
+ if f == nil {
+ return nil
+ }
+ if GB {
+ C.wrap_fn_run_gb28181(unsafe.Pointer(libcffmpeg), f)
+ }
+ if CPU {
+ C.wrap_fn_use_cpu(unsafe.Pointer(libcffmpeg), f)
+ } else if devID > -1 {
+ r := C.wrap_fn_set_devid(unsafe.Pointer(libcffmpeg), f, C.int(devID))
+ if r != 0 {
+ if f != nil {
+ C.wrap_fn_destroy(unsafe.Pointer(libcffmpeg), f)
+ }
+ FreeFFmpeg()
+ }
+ return nil
+ }
+
+ return &GoFFMPEG{
+ ffmpeg: f,
+ }
+}
+
// NewWithLog log
func NewWithLog(GB, CPU bool, ffmpegLog string) *GoFFMPEG {
lf := C.CString(ffmpegLog)
@@ -150,7 +209,7 @@
}
// GetGBJpg Get GB28181 Jpg
-func GetGBJpg(rtspUrl string) []byte {
+func GetGBJpg(rtspURL string) []byte {
rtsp := C.CString(rtspUrl)
defer C.free(unsafe.Pointer(rtsp))
var jpgLen C.int
diff --git a/libcffmpeg.c b/libcffmpeg.c
index 70be86b..c8298a8 100644
--- a/libcffmpeg.c
+++ b/libcffmpeg.c
@@ -178,6 +178,14 @@
return fn_get_avpacket2(h, data, size, key);
}
+int wrap_fn_set_devid(void *lib, const cffmpeg h, const int devid){
+ if (!fn_set_devid){
+ fn_set_devid = (lib_cffmpeg_devid)dlsym(lib, "c_ffmpeg_set_devid");
+ if (!fn_set_devid) return -1;
+ }
+ return fn_set_devid(h, devid);
+}
+
void wrap_fn_release_buf(void *lib, void *buf){
if (!fn_release_buf){
fn_release_buf = (lib_cffmpeg_release_buf)dlsym(lib, "c_ffmpeg_release_buf");
diff --git a/libcffmpeg.h b/libcffmpeg.h
index b1d010c..d11e658 100644
--- a/libcffmpeg.h
+++ b/libcffmpeg.h
@@ -28,6 +28,7 @@
typedef void (*lib_cffmpeg_close_stream)(const cffmpeg);
typedef void*(*lib_cffmpeg_avpacket)(const cffmpeg, int*, int*);
typedef int (*lib_cffmpeg_avpacket2)(const cffmpeg, unsigned char**, int*, int*);
+typedef int (*lib_cffmpeg_devid)(const cffmpeg, const int devid);
typedef void(*lib_cffmpeg_release_buf) (void*);
static lib_cffmpeg_create fn_create = NULL;
@@ -47,7 +48,8 @@
static lib_cffmpeg_pic fn_decoder_pic = NULL;
static lib_cffmpeg_close_stream fn_close_stream = NULL;
static lib_cffmpeg_avpacket fn_get_avpacket = NULL;
-static lib_cffmpeg_avpacket2 fn_get_avpacket2 = NULL;
+static lib_cffmpeg_avpacket2 fn_get_avpacket2 = NULL;
+static lib_cffmpeg_devid fn_set_devid = NULL;
static lib_cffmpeg_release_buf fn_release_buf = NULL;
typedef void* libcffmpeg;
@@ -72,6 +74,7 @@
void wrap_fn_close_stream(void *lib, const cffmpeg h);
void* wrap_fn_get_avpacket(void *lib, const cffmpeg h, int* size, int* key);
int wrap_fn_get_avpacket2(void *lib, const cffmpeg h, unsigned char **data, int* size, int* key);
+int wrap_fn_set_devid(void *lib, const cffmpeg h, const int devid);
void wrap_fn_release_buf(void *lib, void *buf);
// for encoder
--
Gitblit v1.8.0