From f2fb5eb58ae50bb35f2d0ae2673a596adc06cb00 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期一, 28 十月 2019 13:17:01 +0800
Subject: [PATCH] bug fixed gb mem leak

---
 csrc/ffmpeg/format/FormatIn.cpp            |   36 +++++++++++++++++++++---------------
 csrc/thirdparty/gb28181/include/PsToEs.hpp |   16 +++++++++++++++-
 2 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/csrc/ffmpeg/format/FormatIn.cpp b/csrc/ffmpeg/format/FormatIn.cpp
index 420c9ac..59f3f23 100644
--- a/csrc/ffmpeg/format/FormatIn.cpp
+++ b/csrc/ffmpeg/format/FormatIn.cpp
@@ -38,19 +38,13 @@
 
 	FormatIn::~FormatIn()
 	{
-		if(io_ctx_){
-			if(read_io_buff_){
-				read_io_buff_ = NULL;
-			}
-			avio_context_free(&io_ctx_);
-			io_ctx_ = NULL;
-		}
 		if(ctx_){
-			if (!ctx_->oformat){
-				avformat_free_context(ctx_);
-			}else{
+			if (!(ctx_->flags & AVFMT_FLAG_CUSTOM_IO)){
 				avformat_close_input(&ctx_);
+			}else{
+				avformat_free_context(ctx_);
 			}
+
 			ctx_ = NULL;
 			if(dec_ctx_){
 				avcodec_close(dec_ctx_);
@@ -58,18 +52,23 @@
 			}
 			
 		}
+		
 		if (handle_gb28181){
 			delete handle_gb28181;
 		}
+		if(read_io_buff_){
+			av_free(read_io_buff_);
+			read_io_buff_ = NULL;
+		}
+		if(io_ctx_){
+			avio_context_free(&io_ctx_);
+			io_ctx_ = NULL;
+		}
+
 	}
 
 ////////////////////////////////////////////////////////////////////////
 	int FormatIn::openWithCustomIO(void *opaque, read_packet fn, AVDictionary **options/*=NULL*/){
-		ctx_ = avformat_alloc_context();
-		if(!ctx_){
-			logIt("open with custom io create format error\n");
-			return -1;
-		}
 		read_io_buff_ = (uint8_t*)av_malloc(read_io_buff_size_);
 		if(!read_io_buff_){
 			logIt("open with custom io alloc read io buff error\n");
@@ -81,6 +80,13 @@
 			logIt("open with custom io create custom avio error\n");
 			return -1;
 		}
+		
+		ctx_ = avformat_alloc_context();
+		if(!ctx_){
+			logIt("open with custom io create format error\n");
+			return -1;
+		}
+
 		ctx_->pb = io_ctx_;
 
 		auto err = av_probe_input_buffer(ctx_->pb, &ctx_->iformat, NULL, NULL, 0, 0);
diff --git a/csrc/thirdparty/gb28181/include/PsToEs.hpp b/csrc/thirdparty/gb28181/include/PsToEs.hpp
index 2ac629d..88eb4d9 100644
--- a/csrc/thirdparty/gb28181/include/PsToEs.hpp
+++ b/csrc/thirdparty/gb28181/include/PsToEs.hpp
@@ -67,6 +67,16 @@
 		while (!q.empty()) q.pop_front();
 		pthread_mutex_unlock(&mtx);
     }
+	
+	void clearAll(std::function<void(T)> fn){
+		pthread_mutex_lock(&mtx);
+		while (!q.empty()){
+			T value = q.front();
+			fn(value);
+			q.pop_front();
+		} 
+		pthread_mutex_unlock(&mtx);
+	}
 private:
     deque<T> q;
     pthread_mutex_t mtx;
@@ -87,7 +97,11 @@
 
 	~GB28181API(){
 		printf("GB28181API end!\n");
-		m_rtpQueue.clearAll();
+		// m_rtpQueue.clearAll();
+		m_rtpQueue.clearAll([](frameBuffInfo *info){
+			delete[] info->buff;
+			delete info;
+		});
 		deleteCamera();
 	}
 

--
Gitblit v1.8.0