From bfded635a544a1ab5d252739f4be4f7f30b39b7f Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期五, 26 七月 2019 14:46:48 +0800 Subject: [PATCH] update ffmpeg --- apipassive.go | 10 ++--- csrc/wrapper.cpp | 17 +++++--- csrc/wrapper.hpp | 7 ++- cffmpeg.h | 3 + libcffmpeg.c | 10 ++++- csrc/cffmpeg.cpp | 19 ++++++--- libcffmpeg.h | 7 ++- 7 files changed, 46 insertions(+), 27 deletions(-) diff --git a/apipassive.go b/apipassive.go index 5f866f5..5ea32ea 100644 --- a/apipassive.go +++ b/apipassive.go @@ -27,22 +27,20 @@ } // GetInfoRecorder info -func (h *GoFFMPEG) GetInfoRecorder() (string, int, string) { +func (h *GoFFMPEG) GetInfoRecorder() (int, string) { var i C.int = -1 var l C.int - var sid *C.char - p := C.wrap_fn_info_recorder(h.ffmpeg, &sid, &i, &l) + + p := C.wrap_fn_info_recorder(h.ffmpeg, &i, &l) // if p == nil { // return -1, "" // } path := C.GoString(p) C.free(unsafe.Pointer(p)) - goid := C.GoString(sid) - C.free(unsafe.Pointer(sid)) // fmt.Println("Go get info : ", path, " len: ", l) - return goid, int(i), path + return int(i), path } // BuildDecoder build decoder diff --git a/cffmpeg.h b/cffmpeg.h index 6974816..38d99e7 100644 --- a/cffmpeg.h +++ b/cffmpeg.h @@ -22,7 +22,8 @@ /////////passive api void c_ffmpeg_build_recorder(const cffmpeg h, const char*id, const char *dir, int mind, int maxd); void c_ffmpeg_fire_recorder(const cffmpeg h, const char*sid, const int64_t id); -char* c_ffmpeg_get_info_recorder(const cffmpeg h, char **sid, int *index, int *length); +char* c_ffmpeg_get_info_recorder(const cffmpeg h, int *index, int *length); +char* c_ffmpeg_get_rec_id(const cffmpeg h, const char* p, int *length); void c_ffmpeg_build_decoder(const cffmpeg h); void* c_ffmpeg_get_pic_decoder(const cffmpeg h, int *wid, int *hei); diff --git a/csrc/cffmpeg.cpp b/csrc/cffmpeg.cpp index 956d33c..f804054 100644 --- a/csrc/cffmpeg.cpp +++ b/csrc/cffmpeg.cpp @@ -58,12 +58,11 @@ s->FireRecorder(sid, id); } -char* c_ffmpeg_get_info_recorder(const cffmpeg h, char **sid, int *index, int *length){ +char* c_ffmpeg_get_info_recorder(const cffmpeg h, int *index, int *length){ Wrapper *s = (Wrapper*)h; int i; std::string p; - std::string id; - s->GetInfoRecorder(id, i, p); + s->GetInfoRecorder(i, p); // printf("cffmpeg get info : index : %d, file : %s\n", i, p.c_str()); @@ -72,14 +71,20 @@ char *path = (char*)malloc(*length + 1); memcpy(path, p.c_str(), *length); path[*length] = '\0'; - - *sid = (char*)malloc(id.length()+1); - memcpy(*sid, id.c_str(), id.length()); - *sid[id.length()] = '\0'; return path; } +char* c_ffmpeg_get_rec_id(const cffmpeg h, const char* p, int *length){ + Wrapper *s = (Wrapper*)h; + std::string id = s->GetRecorderID(p); + *length = id.length(); + char *i = (char*)malloc(*length+1); + memcpy(i, id.c_str(), *length); + i[*length] = '\0'; + return i; +} + void c_ffmpeg_build_decoder(const cffmpeg h){ Wrapper *s = (Wrapper*)h; s->BuildDecoder(); diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp index 47ddc82..d67cb8d 100644 --- a/csrc/wrapper.cpp +++ b/csrc/wrapper.cpp @@ -246,37 +246,42 @@ func_rec_(path, index); }else{ // passive api std::lock_guard<std::mutex> l(mutex_rec_); - while(list_rec_.size() > 10){ - for(int i = 0; i < 5; i++){ + while(list_rec_.size() > 100){ + for(int i = 0; i < 25; i++){ list_rec_.pop_front(); } } struct record_file_info info; - info.id = id; info.file_frame_index = index; info.file_path = path; list_rec_.emplace_back(info); + list_rec_map_[path] = id; logIt("list rec files count : %d", list_rec_.size()); map_rec_.erase(id); } } - void Wrapper::GetInfoRecorder(std::string &sid, int &index, std::string &path){ + void Wrapper::GetInfoRecorder(int &index, std::string &path){ std::lock_guard<std::mutex> l(mutex_rec_); if(list_rec_.empty()){ index = -1; path = ""; - sid = ""; return; } auto info = list_rec_.front(); index = info.file_frame_index; path = info.file_path; - sid = info.id; list_rec_.pop_front(); // logIt("go get info index: %d, file: %s\n", index, path.c_str()); } + std::string Wrapper::GetRecorderID(const std::string &path){ + auto iter = list_rec_map_.find(path); + if (iter != list_rec_map_.end()){ + return iter->second; + } + return ""; + } ////////decoder void Wrapper::BuildDecoder(){ use_decoder_ = true; diff --git a/csrc/wrapper.hpp b/csrc/wrapper.hpp index 8c866fd..8bbb157 100644 --- a/csrc/wrapper.hpp +++ b/csrc/wrapper.hpp @@ -72,8 +72,8 @@ public: //recorder void BuildRecorder(const char* id,const char *dir, const int mind, const int maxd); int FireRecorder(const char* sid,const int64_t &id); - void GetInfoRecorder(std::string &sid, int &index, std::string &path); - + void GetInfoRecorder(int &index, std::string &path); + std::string GetRecorderID(const std::string &path); // active api void ActiveRecorder(const char *dir, const int mind, const int maxd, FUNC_REC func); @@ -102,11 +102,12 @@ //passive api struct record_file_info{ - std::string id; int file_frame_index; std::string file_path; }; std::list<struct record_file_info> list_rec_; + std::unordered_map<std::string, std::string> list_rec_map_; + std::mutex mutex_rec_; std::list<pic_bgr24> list_pic_; diff --git a/libcffmpeg.c b/libcffmpeg.c index 94e7d5d..5066001 100644 --- a/libcffmpeg.c +++ b/libcffmpeg.c @@ -35,6 +35,8 @@ 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_rec_id = (lib_cffmpeg_rec_id)dlsym(lib, "c_ffmpeg_get_rec_id"); + release_if_err(fn_rec_id, 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"); @@ -99,8 +101,12 @@ fn_fire_recorder(h, sid, id); } -char* wrap_fn_info_recorder(const cffmpeg h, char **sid, int* index, int* length){ - return fn_info_recorder(h, sid, index, length); +char* wrap_fn_info_recorder(const cffmpeg h, int* index, int* length){ + return fn_info_recorder(h, index, length); +} + +char* wrap_fn_rec_id(const cffmpeg h, const char* path, int*length){ + return fn_rec_id(h, path, length); } void wrap_fn_decoder(const cffmpeg h){ diff --git a/libcffmpeg.h b/libcffmpeg.h index eb92d66..9867d44 100644 --- a/libcffmpeg.h +++ b/libcffmpeg.h @@ -21,7 +21,8 @@ typedef void (*lib_cffmpeg_cpu)(const cffmpeg); typedef void (*lib_cffmpeg_recorder)(const cffmpeg, const char*, const char*, int, int); typedef void (*lib_cffmpeg_fire_recorder)(const cffmpeg, const char*, const int64_t); -typedef char*(*lib_cffmpeg_info_recorder)(const cffmpeg, char**, int*, int*); +typedef char*(*lib_cffmpeg_info_recorder)(const cffmpeg, int*, int*); +typedef char*(*lib_cffmpeg_rec_id)(const cffmpeg, const char*, int*); typedef void (*lib_cffmpeg_decoder)(const cffmpeg); typedef void*(*lib_cffmpeg_pic)(const cffmpeg, int*, int*); typedef void*(*lib_cffmpeg_avpacket)(const cffmpeg, int*, int*); @@ -38,6 +39,7 @@ 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; +static lib_cffmpeg_rec_id fn_rec_id = NULL; static lib_cffmpeg_decoder fn_decoder = NULL; static lib_cffmpeg_pic fn_decoder_pic = NULL; static lib_cffmpeg_avpacket fn_get_avpacket = NULL; @@ -57,7 +59,8 @@ void wrap_fn_use_cpu(const cffmpeg h); void wrap_fn_recorder(const cffmpeg h, const char* id, const char* dir, int mind, int maxd); void wrap_fn_fire_recorder(const cffmpeg h, const char *sid, const int64_t id); -char* wrap_fn_info_recorder(const cffmpeg, char** sid, int* index, int* length); +char* wrap_fn_info_recorder(const cffmpeg, int* index, int* length); +char* wrap_fn_rec_id(const cffmpeg h, const char* path, int*length); void wrap_fn_decoder(const cffmpeg h); void* wrap_fn_decoder_pic(const cffmpeg h, int* wid, int* hei); void* wrap_fn_get_avpacket(const cffmpeg h, int* size, int* key); -- Gitblit v1.8.0