diff --git a/src/media/media_decoder.cpp b/src/media/media_decoder.cpp
index 2cd8a06f22a0052f3be9f5a9160cb7c3127da777..cadbb23002e05f3d4fed9737f064568d5f36a216 100644
--- a/src/media/media_decoder.cpp
+++ b/src/media/media_decoder.cpp
@@ -280,10 +280,11 @@ int MediaDecoder::setupFromVideoData()
 }
 
 MediaDecoder::Status
-MediaDecoder::decode(VideoFrame& result, video::VideoPacket& video_packet)
+MediaDecoder::decode(VideoFrame& result)
 {
-    AVPacket *inpacket = video_packet.get();
-    int ret = av_read_frame(inputCtx_, inpacket);
+    AVPacket inpacket;
+    av_init_packet(&inpacket);
+    int ret = av_read_frame(inputCtx_, &inpacket);
     if (ret == AVERROR(EAGAIN)) {
         return Status::Success;
     } else if (ret == AVERROR_EOF) {
@@ -296,13 +297,18 @@ MediaDecoder::decode(VideoFrame& result, video::VideoPacket& video_packet)
     }
 
     // is this a packet from the video stream?
-    if (inpacket->stream_index != streamIndex_)
+    if (inpacket.stream_index != streamIndex_) {
+        av_packet_unref(&inpacket);
         return Status::Success;
+    }
 
     auto frame = result.pointer();
     int frameFinished = 0;
     int len = avcodec_decode_video2(decoderCtx_, frame,
-                                    &frameFinished, inpacket);
+                                    &frameFinished, &inpacket);
+
+    av_packet_unref(&inpacket);
+
     if (len <= 0)
         return Status::DecodeError;
 
@@ -333,10 +339,7 @@ MediaDecoder::decode(const AudioFrame& decodedFrame)
     const auto frame = decodedFrame.pointer();
 
     AVPacket inpacket;
-    memset(&inpacket, 0, sizeof(inpacket));
     av_init_packet(&inpacket);
-    inpacket.data = NULL;
-    inpacket.size = 0;
 
    int ret = av_read_frame(inputCtx_, &inpacket);
     if (ret == AVERROR(EAGAIN)) {
@@ -351,12 +354,16 @@ MediaDecoder::decode(const AudioFrame& decodedFrame)
     }
 
     // is this a packet from the audio stream?
-    if (inpacket.stream_index != streamIndex_)
+    if (inpacket.stream_index != streamIndex_) {
+        av_packet_unref(&inpacket);
         return Status::Success;
+    }
 
     int frameFinished = 0;
     int len = avcodec_decode_audio4(decoderCtx_, frame,
                                     &frameFinished, &inpacket);
+    av_packet_unref(&inpacket);
+
     if (len <= 0) {
         return Status::DecodeError;
     }
@@ -385,14 +392,14 @@ MediaDecoder::Status
 MediaDecoder::flush(VideoFrame& result)
 {
     AVPacket inpacket;
-    memset(&inpacket, 0, sizeof(inpacket));
     av_init_packet(&inpacket);
-    inpacket.data = NULL;
-    inpacket.size = 0;
 
     int frameFinished = 0;
     auto len = avcodec_decode_video2(decoderCtx_, result.pointer(),
                                     &frameFinished, &inpacket);
+
+    av_packet_unref(&inpacket);
+
     if (len <= 0)
         return Status::DecodeError;
 
diff --git a/src/media/media_decoder.h b/src/media/media_decoder.h
index d473d1f0d35125f1636c15beda3d7c97d5c06b9d..16dad8250f1e9f0410cd767a86293b5e3b43e0df 100644
--- a/src/media/media_decoder.h
+++ b/src/media/media_decoder.h
@@ -17,9 +17,7 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
  */
-
-#ifndef __MEDIA_DECODER_H__
-#define __MEDIA_DECODER_H__
+#pragma once
 
 #include "config.h"
 
@@ -79,7 +77,7 @@ class MediaDecoder {
         void setIOContext(MediaIOHandle *ioctx);
 #ifdef RING_VIDEO
         int setupFromVideoData();
-        Status decode(VideoFrame&, video::VideoPacket&);
+        Status decode(VideoFrame&);
         Status flush(VideoFrame&);
  #endif // RING_VIDEO
 
@@ -125,5 +123,3 @@ class MediaDecoder {
 };
 
 } // namespace ring
-
-#endif // __MEDIA_DECODER_H__
diff --git a/src/media/video/video_base.cpp b/src/media/video/video_base.cpp
index 835deb821106f01d8c8774ceef8ecffdb8be2a31..9345bce08d23a2a49eb9995b4c6a9924792c55f2 100644
--- a/src/media/video/video_base.cpp
+++ b/src/media/video/video_base.cpp
@@ -29,15 +29,6 @@
 
 namespace ring { namespace video {
 
-/*=== VideoPacket  ===========================================================*/
-
-VideoPacket::VideoPacket() : packet_(static_cast<AVPacket *>(av_mallocz(sizeof(AVPacket))))
-{
-    av_init_packet(packet_);
-}
-
-VideoPacket::~VideoPacket() { av_free_packet(packet_); av_free(packet_); }
-
 /*=== VideoGenerator =========================================================*/
 
 VideoFrame&
diff --git a/src/media/video/video_base.h b/src/media/video/video_base.h
index 8d694d438ff8b70f943fd6529656e48ae002b2c5..71c08132860b3106d797a8e28b455c26c72326c5 100644
--- a/src/media/video/video_base.h
+++ b/src/media/video/video_base.h
@@ -121,19 +121,6 @@ public:
 struct VideoFrameActiveWriter: Observable<std::shared_ptr<VideoFrame>> {};
 struct VideoFramePassiveReader: Observer<std::shared_ptr<VideoFrame>> {};
 
-/*=== VideoPacket  ===========================================================*/
-
-class VideoPacket {
-    public:
-        VideoPacket();
-        ~VideoPacket();
-        AVPacket* get() { return packet_; };
-
-    private:
-        NON_COPYABLE(VideoPacket);
-        AVPacket *packet_;
-};
-
 /*=== VideoGenerator =========================================================*/
 
 class VideoGenerator : public VideoFrameActiveWriter
diff --git a/src/media/video/video_input.cpp b/src/media/video/video_input.cpp
index 19355e13010c75e077f8ada39cadb6cb825ba912..550cb4a34e0bc0324699d412c1853073af520bde 100644
--- a/src/media/video/video_input.cpp
+++ b/src/media/video/video_input.cpp
@@ -108,8 +108,7 @@ bool VideoInput::captureFrame()
     if (not decoder_)
         return false;
 
-    VideoPacket pkt;
-    const auto ret = decoder_->decode(getNewFrame(), pkt);
+    const auto ret = decoder_->decode(getNewFrame());
 
     switch (ret) {
         case MediaDecoder::Status::ReadError:
diff --git a/src/media/video/video_receive_thread.cpp b/src/media/video/video_receive_thread.cpp
index 10d0d54e59ec8ff6f0e030ca83bf40b02ca66804..6fe210455ef97bac78991284ae68443cc65e1618 100644
--- a/src/media/video/video_receive_thread.cpp
+++ b/src/media/video/video_receive_thread.cpp
@@ -155,8 +155,7 @@ void VideoReceiveThread::addIOContext(SocketPair &socketPair)
 
 bool VideoReceiveThread::decodeFrame()
 {
-    VideoPacket pkt;
-    const auto ret = videoDecoder_->decode(getNewFrame(), pkt);
+    const auto ret = videoDecoder_->decode(getNewFrame());
 
     switch (ret) {
         case MediaDecoder::Status::FrameFinished: