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