From f6172eaa5f78d2af04e8e99fdf26b2b0ad4994d6 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期四, 01 八月 2019 15:51:19 +0800
Subject: [PATCH] bug fix record file thread quit dup pkt

---
 csrc/wrapper.cpp |   24 ++++++++++++++++++------
 1 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp
index e26c1f4..1ebda9d 100644
--- a/csrc/wrapper.cpp
+++ b/csrc/wrapper.cpp
@@ -56,6 +56,12 @@
             delete bridge_; bridge_ = NULL;
         }
     
+        map_rec_.clear();
+        list_rec_pkt_.clear();
+
+        for(auto &i : list_pic_){
+            free(i.data);
+        }
     }
 
     void Wrapper::ScalePicture(const int w, const int h, const int flags){
@@ -199,7 +205,7 @@
                         avpacket p = {k.data, k.id};
                         i.second.rec->CachePacket(p);
                     }
-                    logIt("start rec %d frames", list_rec_pkt_.size());
+                    logIt("START REC %d FRAMES", list_rec_pkt_.size());
                 }
             }else if (i.second.rec){
                 i.second.rec->CachePacket(pkt);
@@ -240,13 +246,13 @@
     }
 
     //////////////recorder
-    std::shared_ptr<Recorder> Wrapper::init_recorder(FormatIn *in, std::string id,std::string dir, const int mind, const int maxd){
+    std::shared_ptr<Recorder> Wrapper::init_recorder(FormatIn *in, std::string id, std::string dir, const int mind, const int maxd){
         if(!in){
             logIt("Init wrapper first");
             return nullptr;
         }
 
-        auto rec = std::make_shared<Recorder>(in, id);
+        auto rec = std::make_shared<Recorder>(in, id.c_str());
 
         rec->SetCallback([&](std::string &id, int &index, std::string &path){
             cache_rec_info(id, index, path);
@@ -267,6 +273,7 @@
     void Wrapper::BuildRecorder(const char* id, const char *output, const int mindur, const int maxdur){
         std::string rid(id);
         std::string dir(output);
+        
         auto fn = [=](FormatIn *in){
             return init_recorder(in, rid, dir, mindur, maxdur);
         };
@@ -286,7 +293,6 @@
                 iter->second.rec->FireRecorder(id);
             }
         }
-        logIt("FIRE REC %s, FRAME ID: %d", sid, id);
     }
 
     void Wrapper::cache_rec_info(std::string &id, int &index, std::string &path){
@@ -300,10 +306,11 @@
         struct record_file_info info;
         info.file_frame_index = index;
         info.file_path = path;
+        info.rec_id = id;
         list_rec_.emplace_back(info);
         list_rec_map_[path] = id;
-        logIt("list rec files count : %d", list_rec_.size());
-        map_rec_.erase(id);
+        logIt("LIST REC FILES COUNT : %d", list_rec_.size());
+        
     }
 
     void Wrapper::GetInfoRecorder(int &index, std::string &path){
@@ -317,6 +324,9 @@
         index = info.file_frame_index;
         path = info.file_path;
         list_rec_.pop_front();
+
+        if (map_rec_.find(info.rec_id) != map_rec_.end())
+            map_rec_.erase(info.rec_id);
         // logIt("go get info index: %d, file: %s\n", index, path.c_str());
     }
 
@@ -327,6 +337,8 @@
             ret = iter->second;
             list_rec_map_.erase(iter);
         }
+        
+
         return ret;
     }
     ////////decoder

--
Gitblit v1.8.0