From 87fea24e8bba1bfbee707cdaa6f7979451531acc Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期六, 19 十月 2019 10:23:01 +0800
Subject: [PATCH] add interface rec duration
---
csrc/wrapper.cpp | 4 ++++
csrc/worker/rec.cpp | 14 ++++++++------
csrc/wrapper.hpp | 4 +++-
cffmpeg.h | 1 +
csrc/worker/rec.hpp | 8 +++++---
libcffmpeg.c | 13 +++++++++++++
csrc/cffmpeg.cpp | 5 +++++
gorec.go | 5 +++++
libcffmpeg.h | 3 +++
9 files changed, 47 insertions(+), 10 deletions(-)
diff --git a/cffmpeg.h b/cffmpeg.h
index 3128ee1..ef67716 100644
--- a/cffmpeg.h
+++ b/cffmpeg.h
@@ -18,6 +18,7 @@
void c_ffmpeg_run_gb28181(const cffmpeg h);
void c_ffmepg_use_cpu(const cffmpeg h);
/////////passive api
+void c_ffmpeg_set_record_duration(const cffmpeg h, const int min, const int max);
void c_ffmpeg_build_recorder(const cffmpeg h, const char*id, const char *dir, int mind, int maxd, int audio);
void c_ffmpeg_fire_recorder(const cffmpeg h, const char*sid, const int64_t id);
void c_ffmpeg_get_info_recorder(const cffmpeg h, int *index, char** recid, int *recidLen, char **fpath, int *pathLen);
diff --git a/csrc/cffmpeg.cpp b/csrc/cffmpeg.cpp
index 824b2a7..690f061 100644
--- a/csrc/cffmpeg.cpp
+++ b/csrc/cffmpeg.cpp
@@ -45,6 +45,11 @@
//////passive api
+void c_ffmpeg_set_record_duration(const cffmpeg h, const int min, const int max){
+ Wrapper *s = (Wrapper*)h;
+ s->SetRecMinCacheTime(min);
+}
+
void c_ffmpeg_build_recorder(const cffmpeg h, const char* id, const char *dir, int mind, int maxd, int audio){
Wrapper *s = (Wrapper*)h;
diff --git a/csrc/worker/rec.cpp b/csrc/worker/rec.cpp
index 01896b0..14069ae 100644
--- a/csrc/worker/rec.cpp
+++ b/csrc/worker/rec.cpp
@@ -20,8 +20,8 @@
{
rec::rec()
:recRef_(NULL)
- ,minduration_(250)
- ,maxduration_(750)
+ ,min_cache_len_(125)
+ ,time_offset_(4)
{}
rec::~rec()
@@ -141,9 +141,6 @@
std::string rid(id);
std::string dir(output);
- minduration_ = mindur * recRef_->getFPS();
- maxduration_ = maxdur * recRef_->getFPS();
-
{
std::lock_guard<std::mutex> l(mtx_rec_);
if (map_rec_.find(rid) != map_rec_.end()){
@@ -197,10 +194,15 @@
shrinkCache();
}
+ void rec::SetRecMinCacheTime(const int min){
+ // 鐢变簬鏁翠釜娴佺▼鑰楁椂,琛ュ伩time_offset_,鍥犱负鏄渶灏忕殑涓�鍗�,鍙湁time_offset_/2
+ min_cache_len_ = (min + time_offset_) * recRef_->getFPS();
+ }
+
int rec::shrinkCache(){
//瓒呰繃鏈�澶х紦瀛�,涓㈠純gop
//缂撳瓨鏈�灏忛暱搴︾殑,鐢ㄤ簬璁板綍
- int md = minduration_ < 201 ? 200 : minduration_;
+ int md = min_cache_len_ < 200 ? 200 : min_cache_len_;
while (list_pkt_.size() > md/2) {
list_pkt_.pop_front();
while(!list_pkt_.empty()){
diff --git a/csrc/worker/rec.hpp b/csrc/worker/rec.hpp
index a19ea29..c802d9a 100644
--- a/csrc/worker/rec.hpp
+++ b/csrc/worker/rec.hpp
@@ -23,9 +23,9 @@
{
private:
ffwrapper::FormatIn *recRef_;
- int maxduration_;
- int minduration_;
-
+ int min_cache_len_;
+ // 鏁翠釜娴佺▼鑰楁椂琛ュ伩褰曞埗鏃堕棿,2s榛樿
+ const int time_offset_;
// 褰曞儚鐨勫疄渚�,瀵瑰簲浠诲姟
std::unordered_map<std::string, std::unique_ptr<buz::Recorder> > map_rec_;
// 澶氱嚎绋嬫坊鍔犱换鍔″疄渚�,鍦ㄨ娴佺嚎绋嬩娇鐢ㄥ綍鍍�,浣嗘槸娣诲姞鍦ㄥ彟涓�涓嚎绋�
@@ -71,6 +71,8 @@
// 鑾峰彇褰曞儚鏂囦欢璺緞鍜屽抚id
void GetRecInfo(std::string &recID, int &index, std::string &path);
+ // 璁剧疆褰曞埗鏃堕暱浣滀负缂撳瓨
+ void SetRecMinCacheTime(const int min);
public:
rec();
~rec();
diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp
index ece3ddf..058e499 100644
--- a/csrc/wrapper.cpp
+++ b/csrc/wrapper.cpp
@@ -225,6 +225,10 @@
}
}
+ void Wrapper::SetRecMinCacheTime(const int mind){
+ rec_->SetRecMinCacheTime(mind);
+ }
+
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;
diff --git a/csrc/wrapper.hpp b/csrc/wrapper.hpp
index ca528f9..4ae1a4f 100644
--- a/csrc/wrapper.hpp
+++ b/csrc/wrapper.hpp
@@ -44,10 +44,12 @@
void BuildRecorder(const char* id,const char *dir, const int mind, const int maxd, const bool audio);
int FireRecorder(const char* sid,const int64_t &id);
void GetInfoRecorder(std::string &recID, int &index, std::string &path);
-
+
+ public:
void GB28181(){gb_ = 1;}
void CPUDec(){cpu_ = 1;}
void AudioSwitch(const bool a);
+ void SetRecMinCacheTime(const int mind);
public: //decoder
void BuildDecoder();
void GetPicDecoder(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id);
diff --git a/gorec.go b/gorec.go
index dcf0f5e..17bcfd8 100644
--- a/gorec.go
+++ b/gorec.go
@@ -52,3 +52,8 @@
return gID, int(i), path
}
+
+// SetRecDurationForCache cache
+func (h *GoFFMPEG) SetRecDurationForCache(min, max int) {
+ C.wrap_fn_rec_duration(h.ffmpeg, C.int(min), C.int(max))
+}
diff --git a/libcffmpeg.c b/libcffmpeg.c
index 8f9bd3f..0486921 100644
--- a/libcffmpeg.c
+++ b/libcffmpeg.c
@@ -21,26 +21,35 @@
release_if_err(fn_create, lib);
fn_create2 = (lib_cffmpeg_create)dlsym(lib, "c_ffmpeg_create2");
release_if_err(fn_create2, lib);
+
fn_destroy = (lib_cffmpeg_destroy)dlsym(lib, "c_ffmpeg_destroy");
release_if_err(fn_destroy, lib);
+
fn_run = (lib_cffmpeg_run)dlsym(lib, "c_ffmpeg_run");
release_if_err(fn_run, 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_rec_duration = (lib_cffmpeg_rec_duration)dlsym(lib, "c_ffmpeg_set_record_duration");
+ release_if_err(fn_rec_duration, 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");
release_if_err(fn_fire_recorder, lib);
fn_info_recorder = (lib_cffmpeg_info_recorder)dlsym(lib, "c_ffmpeg_get_info_recorder");
release_if_err(fn_info_recorder, lib);
+
fn_decoder = (lib_cffmpeg_decoder)dlsym(lib, "c_ffmpeg_build_decoder");
release_if_err(fn_decoder, lib);
fn_decoder_pic = (lib_cffmpeg_pic)dlsym(lib, "c_ffmpeg_get_pic_decoder");
release_if_err(fn_decoder_pic, lib);
+
fn_get_avpacket = (lib_cffmpeg_avpacket)dlsym(lib, "c_ffmpeg_get_avpacket");
release_if_err(fn_get_avpacket, lib);
+
fn_decode = (lib_cffmpeg_decode)dlsym(lib, "c_ffmpeg_decode");
release_if_err(fn_decode, lib);
@@ -101,6 +110,10 @@
fn_recorder(h, id, dir, mind, maxd, audio);
}
+void wrap_fn_rec_duration(const cffmpeg h, const int min, const int max){
+ fn_rec_duration(h, min, max);
+}
+
void wrap_fn_fire_recorder(const cffmpeg h, const char* sid, const int64_t id){
fn_fire_recorder(h, sid, id);
}
diff --git a/libcffmpeg.h b/libcffmpeg.h
index 13be006..231ff64 100644
--- a/libcffmpeg.h
+++ b/libcffmpeg.h
@@ -16,6 +16,7 @@
typedef void (*lib_cffmpeg_run)(const cffmpeg, const char*);
typedef void (*lib_cffmpeg_gb28181)(const cffmpeg);
typedef void (*lib_cffmpeg_cpu)(const cffmpeg);
+typedef void (*lib_cffmpeg_rec_duration)(const cffmpeg, const int, const int);
typedef void (*lib_cffmpeg_recorder)(const cffmpeg, const char*, const char*, int, int, int);
typedef void (*lib_cffmpeg_fire_recorder)(const cffmpeg, const char*, const int64_t);
typedef void (*lib_cffmpeg_info_recorder)(const cffmpeg, int*, char**, int*, char**, int*);
@@ -31,6 +32,7 @@
static lib_cffmpeg_run fn_run = NULL;
static lib_cffmpeg_gb28181 fn_gb28181 = NULL;
static lib_cffmpeg_cpu fn_cpu = NULL;
+static lib_cffmpeg_rec_duration fn_rec_duration = 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;
@@ -50,6 +52,7 @@
void wrap_fn_run(const cffmpeg h, const char* input);
void wrap_fn_run_gb28181(const cffmpeg h);
void wrap_fn_use_cpu(const cffmpeg h);
+void wrap_fn_rec_duration(const cffmpeg h, const int min, const int max);
void wrap_fn_recorder(const cffmpeg h, const char* id, const char* dir, int mind, int maxd, int audio);
void wrap_fn_fire_recorder(const cffmpeg h, const char *sid, const int64_t id);
void wrap_fn_info_recorder(const cffmpeg, int* index, char** recid, int* recidLen, char** fpath, int* pathLen);
--
Gitblit v1.8.0