diff --git a/bin/jni/videomanager.i b/bin/jni/videomanager.i
index 54f1ad492c24ec71bffe03ae8f8f94e0eb314848..dce62da091c7132c13239e3cc63481b1c574bc35 100644
--- a/bin/jni/videomanager.i
+++ b/bin/jni/videomanager.i
@@ -159,9 +159,7 @@ JNIEXPORT void JNICALL Java_net_jami_daemon_JamiServiceJNI_captureVideoPacket(JN
         auto frame = libjami::getNewFrame(input);
         if (not frame)
             return;
-        auto packet = std::unique_ptr<AVPacket, void(*)(AVPacket*)>(av_packet_alloc(), [](AVPacket* pkt){
-            av_packet_free(&pkt);
-        });
+        auto packet = libjami::PacketBuffer(av_packet_alloc());
         if (keyframe)
             packet->flags = AV_PKT_FLAG_KEY;
         setRotation(rotation);
diff --git a/src/client/videomanager.cpp b/src/client/videomanager.cpp
index 7fd72eeabb5a0506382c6f7c42a737e97a008ed9..124c1345cbe3847765f019b937c4518d453be48a 100644
--- a/src/client/videomanager.cpp
+++ b/src/client/videomanager.cpp
@@ -59,12 +59,6 @@ namespace libjami {
 
 MediaFrame::MediaFrame()
     : frame_ {av_frame_alloc()}
-    , packet_(nullptr, [](AVPacket* p) {
-        if (p) {
-            av_packet_unref(p);
-            delete p;
-        }
-    })
 {
     if (not frame_)
         throw std::bad_alloc();
@@ -94,7 +88,7 @@ MediaFrame::reset() noexcept
 }
 
 void
-MediaFrame::setPacket(std::unique_ptr<AVPacket, void (*)(AVPacket*)>&& pkt)
+MediaFrame::setPacket(PacketBuffer&& pkt)
 {
     packet_ = std::move(pkt);
 }
diff --git a/src/jami/videomanager_interface.h b/src/jami/videomanager_interface.h
index bd15e2fd90a3ef341956484386715efcfa6bdfaa..258ad5feaa8459f7d138a48833fd864dfc3d1e8d 100644
--- a/src/jami/videomanager_interface.h
+++ b/src/jami/videomanager_interface.h
@@ -30,6 +30,7 @@ extern "C" {
 struct AVFrame;
 struct AVPacket;
 void av_frame_free(AVFrame** frame);
+void av_packet_free(AVPacket** frame);
 }
 
 #include "def.h"
@@ -62,6 +63,12 @@ struct LIBJAMI_PUBLIC AVFrame_deleter {
 
 typedef std::unique_ptr<AVFrame, AVFrame_deleter> FrameBuffer;
 
+struct LIBJAMI_PUBLIC AVPacket_deleter {
+    void operator()(AVPacket* pkt) const { av_packet_free(&pkt); }
+};
+
+typedef std::unique_ptr<AVPacket, AVPacket_deleter> PacketBuffer;
+
 class LIBJAMI_PUBLIC MediaFrame
 {
 public:
@@ -81,7 +88,7 @@ public:
 
     // Fill this MediaFrame with data from o
     void copyFrom(const MediaFrame& o);
-    void setPacket(std::unique_ptr<AVPacket, void (*)(AVPacket*)>&& pkt);
+    void setPacket(PacketBuffer&& pkt);
 
     // Reset internal buffers (return to an empty MediaFrame)
     virtual void reset() noexcept;
@@ -90,7 +97,7 @@ public:
 
 protected:
     FrameBuffer frame_;
-    std::unique_ptr<AVPacket, void (*)(AVPacket*)> packet_;
+    PacketBuffer packet_;
 };
 
 class LIBJAMI_PUBLIC AudioFrame : public MediaFrame
diff --git a/src/media/media_decoder.cpp b/src/media/media_decoder.cpp
index 1bece6d9877136feb2c4c51b624a058408c82368..8dc5ad4e06de08d40bd91f7912acbbbcd8728336 100644
--- a/src/media/media_decoder.cpp
+++ b/src/media/media_decoder.cpp
@@ -344,12 +344,6 @@ MediaDemuxer::setIOContext(MediaIOHandle* ioctx)
 MediaDemuxer::Status
 MediaDemuxer::decode()
 {
-    auto packet = std::unique_ptr<AVPacket, std::function<void(AVPacket*)>>(av_packet_alloc(),
-                                                                            [](AVPacket* p) {
-                                                                                if (p)
-                                                                                    av_packet_free(
-                                                                                        &p);
-                                                                            });
     if (inputParams_.format == "x11grab" || inputParams_.format == "dxgigrab") {
         auto ret = inputCtx_->iformat->read_header(inputCtx_);
         if (ret == AVERROR_EXTERNAL) {
@@ -366,6 +360,7 @@ MediaDemuxer::decode()
         }
     }
 
+    libjami::PacketBuffer packet(av_packet_alloc());
     int ret = av_read_frame(inputCtx_, packet.get());
     if (ret == AVERROR(EAGAIN)) {
         /*no data available. Calculate time until next frame.
@@ -550,9 +545,10 @@ MediaDecoder::setupStream()
     }
 #endif
 
-    JAMI_DBG() << "Decoding " << av_get_media_type_string(avStream_->codecpar->codec_type)
-               << " using " << inputDecoder_->long_name << " (" << inputDecoder_->name << ")";
-
+    JAMI_LOG("Using {} ({}) decoder for {}",
+             inputDecoder_->long_name,
+             inputDecoder_->name,
+             av_get_media_type_string(avStream_->codecpar->codec_type));
     decoderCtx_->thread_count = std::max(1u, std::min(8u, std::thread::hardware_concurrency() / 2));
     if (emulateRate_)
         JAMI_DBG() << "Using framerate emulation";