diff --git a/daemon/src/video/video_base.cpp b/daemon/src/video/video_base.cpp
index f1b311a0b65623fba298464e5dc895e70ee67c89..4d34aafcf3a1f6144b6cb1a9b573cb93f6aef6de 100644
--- a/daemon/src/video/video_base.cpp
+++ b/daemon/src/video/video_base.cpp
@@ -40,9 +40,10 @@ namespace sfl_video {
 VideoPacket::VideoPacket() : packet_(0)
 {
     packet_ = static_cast<AVPacket *>(av_malloc(sizeof(AVPacket)));
+    av_init_packet(packet_);
 }
 
-VideoPacket::~VideoPacket() { av_free_packet(packet_); }
+VideoPacket::~VideoPacket() { av_free_packet(packet_); av_free(packet_); }
 
 /*=== VideoIOHandle  =========================================================*/
 
@@ -57,7 +58,7 @@ VideoIOHandle::VideoIOHandle(ssize_t buffer_size,
     buf_ = static_cast<unsigned char *>(av_malloc(buffer_size));
     ctx_ = avio_alloc_context(buf_, buffer_size, writeable, opaque, read_cb,
                               write_cb, seek_cb);
-    //ctx_->max_packet_size = buffer_size;
+    ctx_->max_packet_size = buffer_size;
 }
 
 VideoIOHandle::~VideoIOHandle() { av_free(ctx_); av_free(buf_); }
diff --git a/daemon/src/video/video_rtp_session.cpp b/daemon/src/video/video_rtp_session.cpp
index e53804a2fd95c58256202ee438b9e310305fa2c1..40be08e5114608a25bcd07914cff28fe38854c67 100644
--- a/daemon/src/video/video_rtp_session.cpp
+++ b/daemon/src/video/video_rtp_session.cpp
@@ -181,8 +181,6 @@ void VideoRtpSession::forceKeyFrame()
 {
     if (sendThread_.get())
         sendThread_->forceKeyFrame();
-    else
-        ERROR("Video sending thread is NULL");
 }
 
 void
diff --git a/daemon/src/video/video_send_thread.cpp b/daemon/src/video/video_send_thread.cpp
index 85597349529c81a54f495c5406c4973f605c6a6c..9233e60e7d72b39ca0a53fcfce036eec1df7728b 100644
--- a/daemon/src/video/video_send_thread.cpp
+++ b/daemon/src/video/video_send_thread.cpp
@@ -54,8 +54,8 @@ VideoSendThread::VideoSendThread(const std::map<string, string> &args) :
     , forceKeyFrame_(0)
     , thread_(0)
 	, frameNumber_(0)
-    , muxContext_(0)
     , fromMixer_(false)
+    , muxContext_(0)
 {}
 
 VideoSendThread::~VideoSendThread()
@@ -120,7 +120,7 @@ void VideoSendThread::setup()
     }
 
 	EXIT_IF_FAIL(!videoEncoder_->openOutput(enc_name, "rtp",
-											args_["destination"].c_str(), NULL),
+                                            args_["destination"].c_str(), NULL),
 				 "encoder openOutput() failed");
 	videoEncoder_->setIOContext(muxContext_);
 	EXIT_IF_FAIL(!videoEncoder_->startIO(), "encoder start failed");
@@ -160,28 +160,27 @@ void VideoSendThread::run()
 	setup();
 
     while (threadRunning_) {
-		encodeAndSendVideo();
+        VideoFrame *frame = videoSource_->waitNewFrame().get();
+        if (frame)
+            encodeAndSendVideo(frame);
 	}
 
 	delete videoEncoder_;
 
 	if (muxContext_)
 		delete muxContext_;
+    muxContext_ = nullptr;
 }
 
-void VideoSendThread::encodeAndSendVideo()
+void VideoSendThread::encodeAndSendVideo(VideoFrame *input_frame)
 {
 	bool is_keyframe = forceKeyFrame_ > 0;
 
 	if (is_keyframe)
 		atomic_decrement(&forceKeyFrame_);
 
-    // Select frame source to encode
-    VideoFrame *inputframe = videoSource_->waitNewFrame().get();
-	if (inputframe) {
-        EXIT_IF_FAIL(videoEncoder_->encode(*inputframe, is_keyframe, frameNumber_++) >= 0,
-                     "encoding failed");
-    }
+    EXIT_IF_FAIL(videoEncoder_->encode(*input_frame, is_keyframe, frameNumber_++) >= 0,
+                 "encoding failed");
 }
 
 void VideoSendThread::forceKeyFrame()
diff --git a/daemon/src/video/video_send_thread.h b/daemon/src/video/video_send_thread.h
index 57295c52044a578797780b8a4f179a524504960f..5fa57fc5f41e29d511d624b968981805dfa2dcf7 100644
--- a/daemon/src/video/video_send_thread.h
+++ b/daemon/src/video/video_send_thread.h
@@ -51,7 +51,7 @@ private:
     static int interruptCb(void *ctx);
     static void *runCallback(void *);
     void run();
-    void encodeAndSendVideo();
+    void encodeAndSendVideo(VideoFrame *);
 
     std::map<std::string, std::string> args_;
     /*-------------------------------------------------------------*/