From 8e1cae0219ceec7226cfbe4b2995dbddc9b76b25 Mon Sep 17 00:00:00 2001
From: Tristan Matthews <tristan.matthews@savoirfairelinux.com>
Date: Fri, 20 Sep 2013 14:42:51 -0400
Subject: [PATCH] * #30408: video: fix memory leak

VideoEncoder need not be allocated dynamically.
---
 daemon/src/video/video_sender.cpp | 29 ++++++++++++++++-------------
 daemon/src/video/video_sender.h   |  3 ++-
 2 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/daemon/src/video/video_sender.cpp b/daemon/src/video/video_sender.cpp
index 6604ceb1ec..e2a7398262 100644
--- a/daemon/src/video/video_sender.cpp
+++ b/daemon/src/video/video_sender.cpp
@@ -56,16 +56,19 @@ VideoSender::VideoSender(const std::string &id,
     , sdp_()
 { setup(); }
 
+VideoSender::~VideoSender()
+{
+    delete muxContext_;
+}
+
 bool VideoSender::setup()
 {
     const char *enc_name = args_["codec"].c_str();
 
-    videoEncoder_ = new VideoEncoder();
-
 	/* Encoder setup */
 	if (!args_["width"].empty()) {
 		const char *s = args_["width"].c_str();
-		videoEncoder_->setOption("width", s);
+		videoEncoder_.setOption("width", s);
 	} else {
         ERROR("width option not set");
         return false;
@@ -73,39 +76,39 @@ bool VideoSender::setup()
 
 	if (!args_["height"].empty()) {
 		const char *s = args_["height"].c_str();
-		videoEncoder_->setOption("height", s);
+		videoEncoder_.setOption("height", s);
 	} else {
         ERROR("height option not set");
         return false;
     }
 
-	videoEncoder_->setOption("bitrate", args_["bitrate"].c_str());
+	videoEncoder_.setOption("bitrate", args_["bitrate"].c_str());
 
 	if (!args_["framerate"].empty())
-		videoEncoder_->setOption("framerate", args_["framerate"].c_str());
+		videoEncoder_.setOption("framerate", args_["framerate"].c_str());
 
 	if (!args_["parameters"].empty())
-		videoEncoder_->setOption("parameters", args_["parameters"].c_str());
+		videoEncoder_.setOption("parameters", args_["parameters"].c_str());
 
     if (!args_["payload_type"].empty()) {
         DEBUG("Writing stream header for payload type %s",
 			  args_["payload_type"].c_str());
-        videoEncoder_->setOption("payload_type", args_["payload_type"].c_str());
+        videoEncoder_.setOption("payload_type", args_["payload_type"].c_str());
     }
 
-	if (videoEncoder_->openOutput(enc_name, "rtp", args_["destination"].c_str(),
+	if (videoEncoder_.openOutput(enc_name, "rtp", args_["destination"].c_str(),
                                   NULL)) {
         ERROR("encoder openOutput() failed");
         return false;
     }
 
-	videoEncoder_->setIOContext(muxContext_);
-	if (videoEncoder_->startIO()) {
+	videoEncoder_.setIOContext(muxContext_);
+	if (videoEncoder_.startIO()) {
         ERROR("encoder start failed");
         return false;
     }
 
-	videoEncoder_->print_sdp(sdp_);
+	videoEncoder_.print_sdp(sdp_);
     return true;
 }
 
@@ -116,7 +119,7 @@ void VideoSender::encodeAndSendVideo(VideoFrame& input_frame)
 	if (is_keyframe)
 		atomic_decrement(&forceKeyFrame_);
 
-    if (videoEncoder_->encode(input_frame, is_keyframe, frameNumber_++) < 0)
+    if (videoEncoder_.encode(input_frame, is_keyframe, frameNumber_++) < 0)
         ERROR("encoding failed");
 }
 
diff --git a/daemon/src/video/video_sender.h b/daemon/src/video/video_sender.h
index c64fb108a0..3e04a69460 100644
--- a/daemon/src/video/video_sender.h
+++ b/daemon/src/video/video_sender.h
@@ -50,6 +50,7 @@ public:
     VideoSender(const std::string &id,
                 const std::map<std::string, std::string> &args,
                 SocketPair& socketPair);
+    virtual ~VideoSender();
 
     std::string getSDP() const { return sdp_; }
     void forceKeyFrame();
@@ -66,7 +67,7 @@ private:
     std::map<std::string, std::string> args_;
     const std::string &id_;
 
-    VideoEncoder *videoEncoder_;
+    VideoEncoder videoEncoder_;
 
     int forceKeyFrame_;
     int frameNumber_;
-- 
GitLab