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